sql-server – 在SQL Server中的XML文档中查找节点顺序

前端之家收集整理的这篇文章主要介绍了sql-server – 在SQL Server中的XML文档中查找节点顺序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何找到 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',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

怎么运行的:

> for $i in .子句定义了一个包含当前节点(.)的名为$i的变量.这基本上是一个解决XQuery缺乏像XSLT的current()函数的破解.
> ../*表达式选择当前节点的所有兄弟节点(父节点的子节点).
> [. << $i]谓词将兄弟姐妹列表过滤到(<<)当前节点($i)之前的列表.>我们计数()先前的兄弟姐妹的数量,然后加1以获得位置.这样,第一个节点(没有先前的兄弟姐妹)被分配一个位置1.

原文链接:https://www.f2er.com/mssql/82209.html

猜你在找的MsSQL相关文章