加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:33:45 所属栏目:MsSql教程 来源:网络整理
导读:如何找到 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 我试图把这个东西放到一个定义如下的表中 CR
如何找到 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读