使用MS SQL Studio,我需要解析两个以逗号分隔的字段,这些字段彼此对齐。例如:
Name Pet_Name Type
Bob Sally,Betty,Sue Cat,Dog,Cat
Dick Mary,Fido,Polly Dog,Dog,Bird
Parsed to:
Name Pet_Name Type
Bob Sally Cat
Bob Betty Dog
Bob Sue Cat
Dick Mary Dog
Dick Fido Dog
Dick Polly Bird
所有宠物名称都与其各自的类型相匹配。有什么想法吗?
答案 0 :(得分:0)
创建一个输入表。
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)-@i);
SET @t = SUBSTRING(@types2, 1, @j-1);
SET @types2 = SUBSTRING(@types2, @j+1, LEN(@types2)-@j);
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;
结果
Name Pet_Name Type
Bob Sally Cat
Bob Betty Dog
Bob Sue Cat
Dick Mary Dog
Dick Fido Dog
Dick Polly Bird
用T-SQL编写并在SQL Server 2012上测试的代码。
警告这是演示代码,对于生产系统而言不够强大。您必须考虑错误情况,例如Pet_Names和Types中的不同项目数。