2

像下面这样在 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

4 回答 4

2

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

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

选择 tivalue('.', '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 网站上的页面后,我意识到我上面的原始答案是不正确的。该页面说您需要在元素之间使用逗号来构建序列。给出的示例不是“序列”。但是,我关于更改排序顺序的原始信息代表:)

于 2013-04-05T14:06:33.857 回答
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
于 2013-04-05T13:24:21.840 回答
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

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

注意随着 XML 大小的增加,这将比仅使用节点慢得多。

于 2013-04-06T23:20:31.343 回答
1

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

于 2013-04-05T13:17:27.527 回答