Skip to main content
 首页 » 编程设计

xml之在 SQL Server 中查询 XML 片段,无论 Xml 树深度如何

2025年12月25日26lovecherry

我在 Sql Server 中有一些 XML(xml 类型的列),看起来有点像这样

<TreeRoot> 
  <Node id="12" name="name2"> 
    <Node id="54" name="name4654"> 
      <Node id="75" name="name0943> 
        <Node id="58" name="dfd2"> 
        </Node> 
      </Node> 
      <Node id="43" name="543d32"> 
      </Node> 
    </Node> 
  </Node> 
</TreeRoot> 

我正在尝试对此 XML 设计一个查询,该查询将为我提供所有节点 ID 和节点名称的列表,如下所示:

Name     Id 
----------- 
name2    12 
name4654 54 
name0943 57 
dfd2     58 
543d32   43 

我已经有一个查询可以执行此操作 - 但它被硬编码到树的特定级别,这意味着我需要在向 xml 片段添加节点时更新此查询。

有没有办法构建一个 XPath 查询来为我提供这个列表 - 并且足够强大以处理将来的其他级别?

谢谢

:-)

/杰斯珀 丹麦哥本哈根

请您参考如下方法:

这个怎么样:

DECLARE @XmlTable TABLE (ID INT NOT NULL, XmlData XML) 
 
INSERT INTO @XmlTable  
        (ID, XmlData) 
VALUES 
        (1, '<TreeRoot> 
  <Node id="12" name="name2"> 
    <Node id="54" name="name4654"> 
      <Node id="75" name="name0943"> 
        <Node id="58" name="dfd2"> 
        </Node> 
      </Node> 
      <Node id="43" name="543d32"> 
      </Node> 
    </Node> 
  </Node> 
</TreeRoot>') 
 
SELECT 
    NodeName = XC.value('@name', 'varchar(50)'), 
    NodeID = XC.value('@id', 'int') 
FROM @XmlTable 
CROSS APPLY XmlData.nodes('//Node') AS XT(XC) 

给我您正在寻找的输出。

基本上,.nodes()将返回与调用中的 XPath 表达式相对应的 XML 片段的“虚拟”表 - 和 //Node将选择全部<Node>元素 - 无论它们位于 XML 树中的哪个位置。不确定这在大型 XML 结构上是否会 super 快 - 但它应该可以工作。