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

SQL Server 2016多层级XML节点扁平化问题求助

解决方案

可以通过调整XPath定位到所有叶子节点,并拼接父节点名称生成带层级标识的属性名,修改后的代码如下:

DECLARE @XmlString XML = CONVERT(XML, '<Orders><Order><id>1</id><ref>123</ref><from><add>test add</add><code>test code</code></from><to><add>test add</add><code>test code</code></to></Order></Orders>')

SELECT
    CASE 
        WHEN r.value('../fn:local-name(.)', 'nvarchar(50)') = 'Order'
            THEN r.value('fn:local-name(.)', 'nvarchar(50)')
            ELSE CONCAT(r.value('../fn:local-name(.)', 'nvarchar(50)'), '_', r.value('fn:local-name(.)', 'nvarchar(50)'))
    END AS Attribute,
    r.value('.','nvarchar(max)') AS Value    
FROM 
    @XmlString.nodes('//Orders/Order//*[not(*)]')  AS records(r)

代码说明

  • //Orders/Order//*[not(*)]:XPath表达式定位到Order节点下所有没有子元素的叶子节点,直接获取id、ref、add、code这些最终文本节点,避免了原代码中把父节点的所有子文本拼接的问题。
  • CASE语句:判断当前叶子节点的父节点是否为Order,若是则直接用当前节点名称作为属性名;否则将父节点名称与当前节点名称用下划线拼接,生成from_add、to_code这类带层级前缀的属性名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:36:25