我在 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 快 - 但它应该可以工作。


