创建一个输入表。
CREATE TABLE dbo.Input
(
Name NVARCHAR(25) NOT NULL PRIMARY KEY,
Pet_Names NVARCHAR(200) NOT NULL,
Types NVARCHAR(200) NOT NULL
);
INSERT INTO dbo.Input (Name, Pet_Names, Types)
VALUES
(N'Bob', N'Sally,Betty,Sue', N'Cat,Dog,Cat'),
(N'Dick', N'Mary,Fido,Polly', N'Dog,Dog,Bird');
创建一个用户定义的表函数来分割Pet_Names和Types。
CREATE FUNCTION dbo.ufn_Split
(
@name NVARCHAR(25),
@pet_names NVARCHAR(200),
@types NVARCHAR(200)
)
RETURNS @ret TABLE
(
Name NVARCHAR(25),
Pet_Name NVARCHAR(25),
Type NVARCHAR(25)
)
AS
BEGIN
DECLARE @pet_names2 NVARCHAR(200);
DECLARE @types2 NVARCHAR(200);
DECLARE @i INT;
DECLARE @j INT;
DECLARE @p NVARCHAR(25);
DECLARE @t NVARCHAR(25);
SET @pet_names2 = @pet_names;
SET @types2 = @types;
WHILE LEN(@pet_names2) > 0 AND LEN(@types2) > 0
BEGIN
SET @i = CHARINDEX(N',', @pet_names2);
SET @j = CHARINDEX(N',', @types2);
IF @i > 0 AND @j > 0
BEGIN
SET @p = SUBSTRING(@pet_names2, 1, @i-1);
SET @pet_names2 = SUBSTRING(@pet_names2, @i+1, LEN(@pet_names2)[email protected]);
SET @t = SUBSTRING(@types2, 1, @j-1);
SET @types2 = SUBSTRING(@types2, @j+1, LEN(@types2)[email protected]);
END
ELSE
BEGIN
SET @p = @pet_names2;
SET @pet_names2 = NULL;
SET @t = @types2;
SET @types2 = NULL;
END
INSERT INTO @ret (Name, Pet_Name, Type)
VALUES(@Name, @p, @t);
END
RETURN
END;
运行select语句。
SELECT T.*
FROM dbo.Input AS I
CROSS APPLY dbo.ufn_Split(I.Name, I.Pet_Names, I.Types) AS T;
结果写在T-SQL和测试的SQL Server 2012年
买者这是演示代码,而不是用于生产系统足够强大
Name Pet_Name Type
Bob Sally Cat
Bob Betty Dog
Bob Sue Cat
Dick Mary Dog
Dick Fido Dog
Dick Polly Bird
代码。您必须考虑错误情况,例如Pet_Names和Types中的不同数量的项目。
你尝试过什么吗?搜索?什么都没有? – podiluska
是的,我搜查了。几次,几个地方。正常的“SplitString”类型函数不适用于多个字段。你有什么想法吗? – user3641517
在stackoverflow上有很多关于这个主题的问题。尝试搜索。 –