关于在SQL Server中使用XQuery排序顺序的问题

时间:2013-03-06 21:33:11

标签: sql-server sorting xquery xquery-sql

在SQL Server中使用XQuery的SELECT的结果是否保证按文档顺序排列,即原始顺序中的节点是否在xml字符串中列出?

DECLARE @x XML = '<hey i="3"/><hey i="4"/><hey i="0"/>'
SELECT t.i.value('.', 'int')
FROM @x.nodes('/hey/@i') t(i)

我问,因为一般SELECT语句不保证订单,除非提供订单。

另外,如果这个订单是(或不是)保证,是否正式记录在某个地方,可能在微软的网站上?

最后,是否可以根据SELECT声明中的原始文档顺序对文档顺序进行排序或进行其他奇怪的排序和查询?

4 个答案:

答案 0 :(得分:2)

DECLARE @x XML = '<hey i="3"/><hey i="4"/><hey i="0"/>' 是XML“序列”的一个例子。根据定义,如果没有排序顺序,则选择应始终以文档原始顺序返回。

如前所述,您可以更改排序顺序。这是一个例子:

选择t.i.value('。','int')为x,ROW_NUMBER()OVER(ORDER BY(SELECT NULL))为rn

FROM @ x.nodes('/ hey / @ i')t(i)

由rn desc命令

以下是有关Microsoft网站上序列的一些信息:

http://msdn.microsoft.com/en-us/library/ms179215(v=sql.105).aspx

以下是对Xquery中序列的更一般性讨论。

http://en.wikibooks.org/wiki/XQuery/Sequences


我在阅读上面提到的Microsoft网站上的页面后发现上面的原始答案不正确。该页面表示您需要在元素之间使用逗号来构造序列。给出的例子不是“序列”。但是,我关于更改排序顺序的原始信息有:)

答案 1 :(得分:1)

我认为相同的Select规则适用于此,无论您是从普通表中选择还是XML。有选择部分,还有投影部分,引擎可以采用不同的路径来检索数据(例如,从中间侧面)。不幸的是,我找不到任何正式文件来支持这一点。 当然,没有可以访问和操作的内部表/文档顺序。

答案 2 :(得分:1)

您可以将order by子句添加到select语句中。

DECLARE @x XML = '<hey i="3"/><hey i="4"/><hey i="0"/>'SELECT [column1] = t.i.value('.', 'int') FROM @x.nodes('/hey/@i') t(i)  order by column1 desc

答案 3 :(得分:1)

我知道你对此的意思。我怀疑订单是文件订单,但文档没有说清楚,并且隐含地依赖它是不好的。

对订单充满信心的一种方法是:

DECLARE @x XML = '<hey i="3"/><hey i="4"/><hey i="0"/>';
select @x.value('(/hey[sql:column("id")]/@i)[1]', 'int'), id
from (
    select row_number() over (order by (select 0)) as id
    from @x.nodes('/hey') t(i)
) t
order by id

然后,这将为您提供一种方法来回答您的其他问题,即以相反的方式或其他顺序获取值。

N.B。随着XML大小的增加,这将比使用节点慢得多。