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

在SQL Server中解析含命名空间的XML:获取指定节点值与拼接字符串

解析SQL Server中的XML:获取指定节点值并拼接数组节点

搞定这个XML解析问题的核心是正确处理命名空间——你的XML里有三个不同的命名空间,必须明确声明才能让SQL Server识别节点。下面是适配不同SQL Server版本的完整解决方案:

先补全你的XML片段(方便测试)

我把你提供的片段补全了d1p1:Val2节点,确保代码能直接运行:

<FirstData xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:d1p1="http://XXXXXX" 
           xmlns="http://YYYYYY" 
           i:type="d1p1:StaticInfo">
  <Timestamp>0</Timestamp>
  <ActionResult i:nil="true" />
  <d1p1:Val2>SampleVal2</d1p1:Val2>
  <d1p1:Val1 xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <d2p1:string>1</d2p1:string>
    <d2p1:string>2</d2p1:string>
    <d2p1:string>3</d2p1:string>
  </d1p1:Val1>
</FirstData>

方案1:SQL Server 2017及以上版本(推荐)

用STRING_AGG()直接拼接字符串,代码更简洁:

DECLARE @xml XML = '<!-- 这里放你的XML内容 -->';

WITH XMLNAMESPACES (
    DEFAULT 'http://YYYYYY',          -- 根节点的默认命名空间
    'http://XXXXXX' AS d1p1,          -- d1p1前缀对应的命名空间
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays' AS d2p1  -- d2p1前缀对应的命名空间
)
SELECT
    -- 获取d1p1:Val2的节点值
    @xml.value('(/FirstData/d1p1:Val2)[1]', 'NVARCHAR(MAX)') AS Val2Value,
    -- 拼接所有d2p1:string的值,用逗号分隔(可自定义分隔符)
    STRING_AGG(s.value('.', 'NVARCHAR(MAX)'), ', ') AS ConcatenatedStrings
FROM @xml.nodes('/FirstData/d1p1:Val1/d2p1:string') AS t(s);

方案2:SQL Server 2016及更早版本

如果你的版本不支持STRING_AGG(),用STUFF() + FOR XML PATH()的经典写法:

DECLARE @xml XML = '<!-- 这里放你的XML内容 -->';

WITH XMLNAMESPACES (
    DEFAULT 'http://YYYYYY',
    'http://XXXXXX' AS d1p1,
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays' AS d2p1
)
SELECT
    @xml.value('(/FirstData/d1p1:Val2)[1]', 'NVARCHAR(MAX)') AS Val2Value,
    -- 拼接字符串并去掉开头的分隔符
    STUFF(
        (SELECT ', ' + s.value('.', 'NVARCHAR(MAX)')
         FROM @xml.nodes('/FirstData/d1p1:Val1/d2p1:string') AS t(s)
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
        1, 2, ''
    ) AS ConcatenatedStrings;

关键注意事项

  • 替换命名空间URL:把代码中的http://XXXXXX、http://YYYYYY替换成你XML中实际的命名空间地址,否则会找不到节点。
  • 表列中的XML:如果XML是存在表的列里,把变量@xml替换成表列名,比如FROM YourTable CROSS APPLY YourXmlColumn.nodes(...) AS t(s)。
  • 节点路径:(/FirstData/d1p1:Val2)[1]中的[1]确保只取第一个匹配的节点,避免返回多条结果。

内容的提问来源于stack exchange,提问作者Bohdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:38:47