在 SQL Server 中查找 XML 文档中的节点顺序

2024-02-14

如何找到 XML 文档中节点的顺序?

我拥有的是这样的文档:

<value code="1">
    <value code="11">
        <value code="111"/>
    </value>
    <value code="12">
        <value code="121">
            <value code="1211"/>
            <value code="1212"/>
        </value>
    </value>
</value>

我试图将这个东西放入一个定义如下的表中

CREATE TABLE values(
    code int,
    parent_code int,
    ord int
)

保留 XML 文档中值的顺序(它们不能按代码排序)。我希望能够说

SELECT code 
FROM values 
WHERE parent_code = 121 
ORDER BY ord

确定性地,结果应该是

code
1211
1212

我努力了

SELECT 
    value.value('@code', 'varchar(20)') code, 
    value.value('../@code', 'varchar(20)') parent, 
    value.value('position()', 'int')
FROM @xml.nodes('/root//value') n(value)
ORDER BY code desc

但它不接受position()功能 ('position()' 只能在谓词或 XPath 选择器中使用)。

我想以某种方式是可能的,但是如何呢?


您可以模仿position()函数通过计算每个节点之前的兄弟节点的数量:

SELECT
    code = value.value('@code', 'int'),
    parent_code = value.value('../@code', 'int'),
    ord = value.value('for $i in . return count(../*[. << $i]) + 1', 'int')
FROM @Xml.nodes('//value') AS T(value)

这是结果集:

code   parent_code  ord
----   -----------  ---
1      NULL         1
11     1            1
111    11           1
12     1            2
121    12           1
1211   121          1
1212   121          2

怎么运行的:

  • The for $i in . http://msdn.microsoft.com/en-us/library/ms190945.aspx子句定义了一个名为$i包含当前节点(.)。这基本上是一个解决 XQuery 缺乏类似 XSLT 的问题的 hackcurrent()功能。
  • The ../*表达式选择当前节点的所有兄弟节点(父节点的子节点)。
  • The [. << $i]谓词将兄弟姐妹列表过滤为 (<< http://msdn.microsoft.com/en-us/library/ms190935.aspx) 当前节点 ($i).
  • We count()前面的兄弟姐妹的数量,然后加 1 以获得位置。这样,第一个节点(没有前面的兄弟节点)的位置就被分配为 1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SQL Server 中查找 XML 文档中的节点顺序 的相关文章

随机推荐