sql-server – “nodes()”方法是否保留文档的顺序?
|
xml数据类型的nodes()方法是否以文件顺序返回节点? 例如,如果有如下数据: declare @xml xml set @xml = '<Fruits><Apple /><Banana /><Orange /><Pear /></Fruits>' 被查询 select T.c.query('.')
from @xml.nodes('/Fruits/*') T(c)
将以文件顺序返回元素?如果order by被省略,则select已返回的行的顺序是未定义的.选择…从… .nodes()的情况,是否是例外? 在某些情况下是否可能在以下查询的输出中获取非空的行集: declare @xml xml
set @xml = '<Data><Element OrderNo="1" /><Element OrderNo="2" />'
+ '<Element OrderNo="3" /><Element OrderNo="4" />'
+ '<Element OrderNo="5" /></Data>'
select * from (
select T.c.value('.','int') OrderNo1,row_number() over (order by @@spid) OrderNo2
from @xml.nodes('/Data/Element/@OrderNo') T(c)) sq
where OrderNo1 != OrderNo2
解决方法是的,nodes()以文档顺序生成一个行集.查询计划中使用的运算符是 Table Valued Function XML Reader.
但是没有订单的查询有一个未定义的顺序,所以没有保证. 解决这个问题的一种方法是使用row_number()over()子句中的表值函数生成的id,并按顺序使用生成的数字. select X.q
from
(
select T.c.query('.') as q,row_number() over(order by T.c) as rn
from @xml.nodes('/Fruits/*') T(c)
) as X
order by X.rn
直接用T.c命令是不可能的.尝试会给你
该错误没有提到它应该与row_number一起工作,但它可以很好地是可能会被修复的错误,所以上面的代码将失败.但直到SQL Server 2012它的工作正常. 获取保证订单而不依赖于未记录使用row_number的方法将是使用您通过位置提取节点的数字表. select T.c.query('.') as q
from Numbers as N
cross apply @xml.nodes('/Fruits/*[sql:column("N.Number")]') as T(c)
where N.Number between 1 and @xml.value('count(/Fruits/*)','int')
order by N.Number (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql – 检查外键约束“在线”
- 这个简单的SQL查询可以优化吗?
- sql – DataReader.GetString()通过columnname
- 如何删除Openshift应用程序上的数据库盒?
- SQL Server 2000数据库的备份文件恢复到Sql2005的方法
- sqlserver下将数据库记录的列记录转换成行记录的方法
- SQL Server 索引结构及其使用(二) 改善SQL语句
- sql – 没有sysadmin权限的OpenRowSet和OpenDataSet
- 通过命令行导入到mysql数据库时出现乱码的解决方法
- mysql Access denied for user ‘root’@’localhost’ (us
