如何修改T-SQL的OpenXml语句使每个Alias单独成一条记录?
解决OpenXML提取XML中Alias为单独记录的问题
首先,咱们来分析下你当前查询的问题:你的XPath指向的是<Aliases>节点,然后用'.'提取该节点的文本内容,这种写法没有正确映射到每个单独的<Alias>子节点,导致结果被意外拼接在一起。
要让每个Alias作为单独的记录返回,有两种简单的修改方式:
方法1:调整XPath直接指向每个节点
把XPath路径改为'/Entity/Aliases/Alias',这样OPENXML会遍历所有的<Alias>节点,每个节点对应一行记录:
SELECT Alias FROM OPENXML(@XML, '/Entity/Aliases/Alias', 2) WITH ( Alias varchar(255) '.' )
方法2:保留原XPath,修改WITH子句的节点映射
如果你想保持XPath指向<Aliases>节点,可以在WITH子句里明确指定提取<Alias>子节点的内容:
SELECT Alias FROM OPENXML(@XML, '/Entity/Aliases', 2) WITH ( Alias varchar(255) 'Alias' )
额外推荐:使用更现代的XQuery方法
OPENXML是比较旧的XML处理方式,现在SQL Server更推荐使用XQuery的nodes()方法,它不需要额外的内存准备/清理操作(比如sp_xml_preparedocument和sp_xml_removedocument),代码更简洁安全:
SELECT x.value('.', 'varchar(255)') AS Alias FROM @XML.nodes('/Entity/Aliases/Alias') AS t(x)
以上三种方式都能让你得到每行一个Alias的结果:
- TEST 1
- TEST 2
- TEST 3
内容的提问来源于stack exchange,提问作者xMilos
相关产品推荐
相关产品推荐

