在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
相关产品推荐
相关产品推荐

