本文介绍了在SQL中连接字符串的各种方法,包括对连接的值不进行xml编码的代码的改进版本。
SELECT ID, abc = STUFF
(
(
SELECT ',' + name
FROM temp1 As T2
-- You only want to combine rows for a single ID here:
WHERE T2.ID = T1.ID
ORDER BY name
FOR XML PATH (''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '')
FROM temp1 As T1
GROUP BY id
要理解发生了什么,从内部查询开始:
SELECT ',' + name
FROM temp1 As T2
WHERE T2.ID = 42 -- Pick a random ID from the table
ORDER BY name
FOR XML PATH (''), TYPE
因为您指定了FOR XML,所以您将得到一个包含表示所有行的XML片段的单行。
因为没有为第一列指定列别名,所以每一行都被包装在一个XML元素中,在for XML PATH后面的方括号中指定了名称。例如,如果你有For XML PATH ('X'),你会得到一个看起来像这样的XML文档:
<X>,aaa</X>
<X>,bbb</X>
...
但是,因为你没有指定一个元素名称,你只是得到一个值列表:
,aaa,bbb,...
. value('。', 'varchar(max)')只是从结果XML片段中检索值,而不进行XML编码任何“特殊”字符。你现在有一个看起来像这样的字符串:
',aaa,bbb,...'
然后STUFF函数删除前导逗号,给出的最终结果如下所示:
'aaa,bbb,...'
乍一看,它看起来相当混乱,但与其他一些选项相比,它确实表现得相当好。