如何从SQL Server多列XML数据中提取逗号分隔值
解决SQL Server XML列多值合并为逗号分隔字符串的问题
要将XML列中所有<value>节点的内容提取并合并为逗号分隔的字符串,同时关联原表的每一行数据,可以通过以下两种方式实现:
方法一:使用STRING_AGG(SQL Server 2017及以上版本)
STRING_AGG是SQL Server 2017引入的聚合函数,能直接将分组内的字符串拼接为指定分隔符的格式,写法更简洁:
SELECT ColumnA, -- 合并ColumnB的XML节点值 STRING_AGG(b.value('.', 'varchar(max)'), ', ') AS ColumnB, -- 合并ColumnC的XML节点值 STRING_AGG(c.value('.', 'varchar(max)'), ', ') AS ColumnC FROM YourTable -- 解析ColumnB的XML结构,展开所有<value>节点 CROSS APPLY ColumnB.nodes('/collection/object/fields/field/value') AS B(b) -- 解析ColumnC的XML结构,展开所有<value>节点 CROSS APPLY ColumnC.nodes('/collection/object/fields/field/value') AS C(c) GROUP BY ColumnA;
方法二:使用FOR XML PATH(兼容SQL Server 2016及以下版本)
如果你的SQL Server版本不支持STRING_AGG,可以用FOR XML PATH拼接字符串,再通过STUFF去掉开头多余的分隔符:
SELECT ColumnA, -- 处理ColumnB的XML列 STUFF(( SELECT ', ' + b.value('.', 'varchar(max)') FROM ColumnB.nodes('/collection/object/fields/field/value') AS B(b) FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 2, '') AS ColumnB, -- 处理ColumnC的XML列 STUFF(( SELECT ', ' + c.value('.', 'varchar(max)') FROM ColumnC.nodes('/collection/object/fields/field/value') AS C(c) FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 2, '') AS ColumnC FROM YourTable;
注意事项
- 如果XML列可能存在
NULL值,建议将CROSS APPLY替换为OUTER APPLY,避免过滤掉XML列为空的行; - 若XML包含Unicode字符,将
varchar(max)替换为nvarchar(max)以避免乱码; - 可根据需求调整分隔符(比如把
,改为,)。
内容的提问来源于stack exchange,提问作者Bhushan
相关产品推荐
相关产品推荐

