2017-07-24 182 views
1

什么我的数据是这样的:SQL SERVER枢纽,并从一个领域创造多个记录和分裂等领域

Name: Animals(One-Column): 
Bill Dog, Cat, Horse 
Bob  Dog, Giraffe, Snake , Horse 

我需要将其转换成什么:

Name: Animal: 
Bill Dog 
Bill Cat 
Bill Horse 
Bob  Dog 
Bob  Giraffe 
Bob  Snake 
Bob  Horse 

我不确定的要采取的步骤,实际csv字段中有0到100个值。

你会发现,CSV的不一致(马是比尔字3,但字4鲍勃),所以我需要一个像一个解决方案:

1st Name 1st Word 
1st Name 2nd Word 
2nd Name 1st Word 
2nd Name 2nd Word 
2nd Name 3rd Word 
... 
+0

这与'PIVOT'无关。您只需要在分割功能上使用“CROSS APPLY”。 –

+0

如果你有SQL Server 2016,那么有一个函数STRING_SPLIT(),对于旧版本只有谷歌的字符串分割函数,有很多可供下载。 –

回答

1
create function [dbo].[udf_splitstring] (@tokens varchar(max), 
             @delimiter varchar(5)) 
returns @split table (
    token varchar(200) not null) 
as 
    begin 
     declare @list xml 

     select @list = cast('<a>' 
          + replace(@tokens, @delimiter, '</a><a>') 
          + '</a>' as xml) 

     insert into @split 
        (token) 
     select ltrim(t.value('.', 'varchar(200)')) as data 
     from @list.nodes('/a') as x(t) 

     return 
    end 



    CREATE TABLE #TABLE1 
    ([NAME] VARCHAR(4), [ANIMALS] VARCHAR(27)) 
; 

INSERT INTO #TABLE1 
    ([NAME], [ANIMALS]) 
VALUES 
    ('BILL', 'DOG, CAT, HORSE'), 
    ('BOB', 'DOG, GIRAFFE, SNAKE , HORSE') 
; 
SELECT * FROM #TABLE1 

SELECT NAME ,TOKEN FROM #TABLE1 AA 
CROSS APPLY (SELECT * FROM UDF_SPLITSTRING(ANIMALS,','))A 

输出

name token 
Bill Dog 
Bill Cat 
Bill Horse 
Bob  Dog 
Bob Giraffe 
Bob Snake 
Bob Horse 
+0

消息317,级别16,状态1,过程UDF_SPLITSTRING,行16 [批处理开始行0] 表值函数'NODES'不能有列别名。 –

+0

@ OligarchicTendencies检查我编辑的答案 – Chanukya

+0

谢谢....那么为什么.nodes需要小写?这与列别名有什么关系? –

0

一种方法是递归CTE:

with cte as (
     select name, animals, 1 as lev, 
      left(animals, charindex(',', animals + ',')) as animal 
     from t 
     union all 
     select name, animals, lev + 1, 
      left(animals, charindex(',', animals + ',')) as animal 
     from cte 
     where animals <> '' 
    ) 
select name, animal, lev 
from cte; 

如果您实际上在列表中有100个项目,您可能必须设置最大递归选项。