You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:27:15