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一般的に、声明は注文が提供されない限り注文を保証するものではないので、お願いします。

また、この注文が保証されている(または保証されていない)場合、それは公式のどこか、おそらくMicrosoftのWebサイトに文書化されていますか?

SELECT最後に、ステートメント内から元のドキュメントの順序に基づいて、ドキュメントの順序とは逆に並べ替えたり、他の奇妙な並べ替えやクエリを実行したりすることはできますか?

4

4 に答える 4

2

これ DECLARE @x XML = '<hey i="3"/><hey i="4"/><hey i="0"/>' は、XML「シーケンス」の例です。定義上、ソート順がない場合、選択は常にドキュメントの元の順序に戻る必要があります。

すでに述べたように、ソート順を変更できます。これが1つの例です:

SELECT tivalue('。'、'int')as x、ROW_NUMBER()OVER(ORDER BY(SELECT NULL))as rn

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

rndescによる注文

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

ここでは、通常のテーブルから選択するかXMLから選択するかに関係なく、同じ選択規則が適用されると思います。選択部分と投影部分があり、エンジンはさまざまなパスを使用してデータを取得できます(たとえば、中央から横向きに)。残念ながら、それをサポートする公式文書は見つかりません。そして確かに、アクセスして操作できる固有のテーブル/ドキュメントの順序はありません。

于 2013-04-05T13:17:27.527 に答える
1

selectステートメントにorderby句を追加できます。

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

私はあなたがこれについて何を意味するのか知っています。順序はドキュメントの順序になると思いますが、ドキュメントでは明確になっておらず、暗黙的にそれに依存するのは良くありません。

注文に自信を持つ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 に答える