2013-03-22 99 views
7

下面的代码(我从here得到的)在将多个字段用逗号分隔的字段之间做了很好的合并。使用回车换行将多行合并到一列中

select player, 
    stuff((SELECT distinct ', ' + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH('')),1,1,'') 
from yourtable t1 
group by player 

我需要替换回车换行符逗号。我尝试了下面的代码,但它开始用这些字符分隔条目:“#x0D;”

select player, 
    stuff((SELECT distinct CHAR(13)+CHAR(10) + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH('')),1,1,'') 
from yourtable t1 
group by player 

我怀疑问题是与 “FOR XML PATH( '')),1,1, ''”,但我不知道是什么值放。

任何帮助将不胜感激。

谢谢!

回答

8

你实际上可以用STUFF的结果替换逗号。

试试这个:

select player, 
    replace(stuff((SELECT distinct ', ' + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH('')),1,1,''), ',', char(13) + char(10)) 
from yourtable t1 
group by player 
+0

它的工作!谢谢! :) – Osprey 2013-03-22 14:40:47

+0

如何去换行而不是逗号? – 2018-03-08 10:38:14

3

可以处理所有的特殊字符XML增加(其中#x0D;就是其中之一)使用:

FOR XML PATH(''), TYPE).value('.','nvarchar(max)') 

更多信息here

你还需要的STUFF第三个参数调整到你需要在你的结果开始跳过(在这种情况下,以2因为你有char(13)char(10))的字符数。

所以,你的解决方案是:

select player, 
    stuff((SELECT distinct CHAR(13)+CHAR(10) + cast(score as varchar(10)) 
     FROM yourtable t2 
     where t2.player = t1.player 
     FOR XML PATH(''), TYPE).value('.','nvarchar(max)'),1,2,'') 
from yourtable t1 
group by player