2013-03-06 55 views
2

使用XQuery是一种SELECT象下面这样保证在文档顺序的SQL Server使用XQuery的一个结果,那就是在节点中的XML字符串中列出的原始顺序?问题关于排序在SQL Server

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声明中的原始文档顺序,是否可以对文档顺序进行排序或进行其他奇怪的排序和查询?

+3

[msdn文档](http://msdn.microsoft.com/en-us/library/ms188306.aspx) – dferidarov 2013-04-09 13:11:24

+0

@dferidarov不是这个答案,至少对我的第一个问题?你为什么不把它作为答案发布? – user12861 2013-04-09 22:08:56

回答

2

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

如,您可以更改排列顺序。这里是一个例子:

SELECT tivalue( 'INT'”。 ')为x,ROW_NUMBER()OVER(ORDER BY(SELECT NULL))作为RN

FROM @ x.nodes('/哎/ @ I')T(I)

为了通过RN降序

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

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

下面是一个更一般的二对Xquery中的一个序列的讨论。

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


我意识到,上面我原来的答复是读微软的网站我上面提到的页面后,不正确。该页面说,你需要用元素之间的逗号来构造一个序列。给出的例子不是一个“序列”。然而,我要改变排列顺序原有的信息代表:)

1

我认为选择的规则同样适用在这里,不管你是从普通的表,或者XML selectig。有选择部分,有投影部分,并且引擎可以采用不同的路径来检索数据(例如,从中间横向)。不幸的是,我找不到任何官方文件来支持这一点。 当然,没有可以访问和操作的内在表格/文档顺序。

+0

@dferidarov在上面的评论中找到的文档似乎与此相矛盾,尽管它对我来说并不完全清楚。 – user12861 2013-04-11 14:03:31

1

您可以通过子句的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 
+0

这不是我感兴趣的顺序。这是通过存储在xml中的值进行排序的,我已经知道该如何操作。我对节点在字符串中列出的原始顺序感兴趣。也许可以颠倒这个顺序,并用它来做其他事情。 – user12861 2013-04-05 14:53:57

+0

您是否看到过我的排序示例? – 2013-04-05 15:05:48

+0

我确实看到了,我在想它。 – user12861 2013-04-06 15:45:53

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大小的增加,这将比仅使用节点要慢得多。