2014-05-15 28 views
-2

使用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

你尝试过什么吗?搜索?什么都没有? – podiluska

+0

是的,我搜查了。几次,几个地方。正常的“SplitString”类型函数不适用于多个字段。你有什么想法吗? – user3641517

+0

在stackoverflow上有很多关于这个主题的问题。尝试搜索。 –

回答

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)[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中的不同数量的项目。

+0

如果数据量很高,SSIS(SQL Server Integration Services)将提供更好的解决方案。 – RichardCL

+0

这大多适合我。问题在于每个名称一旦获得3的类型长度,它就会保留3直到最终记录。在上面的例子中,这不是问题,但是如果输入是猫,鸟,鸟,狗:它给了我“猫”“比尔”“,比”“d,狗” – user3641517

+0

你需要发布你的代码,所以我们可以看到发生了什么。如果有帮助,请不要忘记标记我的答案。 – RichardCL