2013-11-21 54 views
0

我有一个功能来分割CSV。我有这样的数据:SQL Server:分割CSV

identifier values 
123   abc,def,ghi 
124   jre,ds,qwert 

而且我所要的输出是:

123 abc 
123 def 
123 ghi 
124 jre 
124 ds 
124 qwert 

我如何去这样做呢?

感谢, 哈利

这是我目前有;

SELECT CustomRecordsetId, LTRIM(Value) AS my_values 
FROM 
    (
    SELECT *, 
    CAST('<X>'+replace(Value,',','</X><X>')+'</X>' as XML) as my_Xml 
    FROM dbo.CustomFieldValue where CustomFieldId=177 
) T1 
    CROSS APPLY 
    ( 
    SELECT my_Data.D.value('.','varchar(50)') as my_Splits 
    FROM T1.my_Xml.nodes('X') as my_Data(D) 
) T2 

虽然这是返回;

id |  values 
596 | 151, 313 
596 | 151, 313 
603 | 165 
604 | 187 
605 | 174 
606 | 181, 182 
606 | 181, 182 
+1

作为一个方面说明。不要以这种方式存储您的数据。 – Zane

+1

作为一个脚注。告诉我们你试过的东西。 – Kermit

+0

我正在尝试第一个链接。我对mssql命令不是很好(好吧,除了nosql以外,一般都是db)。 Zane:我不这样做,这是一种可怕的做法。我正在从一个可怕的软件中导出数据库,我必须做一个查找,查找,连接,然后再查找一个数据库,只是为了得到一个相关的字段(当它们可能在相邻的列中彼此相邻时)。 不幸的是,我不再拥有我所做的,因为我只是替换了代码。将来,我会保持我所做的。 –

回答

2

我已经尝试了一些解决方案,但这是一个最好的IMO。

SELECT identifier, LTRIM(T2.my_Splits) AS my_values 
FROM 
    (
    SELECT *, 
    CAST('<X>'+replace(T.values,',','</X><X>')+'</X>' as XML) as my_Xml 
    FROM YOURTABLE T 
) T1 
    CROSS APPLY 
    ( 
    SELECT my_Data.D.value('.','varchar(50)') as my_Splits 
    FROM T1.my_Xml.nodes('X') as my_Data(D) 
) T2 
+0

我已经试过这段代码,并修改了我原来的帖子。有小费吗?谢谢您的帮助。 –

+0

没关系,我的意思是使用my_Splits而不是my_values,我不知道为什么没有发生在我身上。 –

+0

我真的不能赞赏这个答案。它来自这个SO问题,但我没有时间去查阅它。解决方案并不是被接受的答案。 KAF仍然是这位天才小片的真正作者。 http://stackoverflow.com/questions/13159526/split-values-over-multiple-rows – smoore4