0

次のように、ユーザーの検索結果の行をxml形式で保存するテーブルがあります。

<row id="5083" />
<row id="5085" />
<row id="5087" />
<row id="5090" />
<row id="5094" />
... (about 500,000 rows)

ここで、各行要素には、結果ページに表示される結果レコードのIDが含まれています。ここで、たとえば2ページ目(10番目の要素から20番目の要素)など、特定の1つのページのIDを選択する必要があります。

最初の問題は、xqueryでその結果を取得するにはどうすればよいですか?position()関数を使おうとしましたが、機能しませんでした...

select @results.query('for $x in (row)
where $x/position() > 10
return ($x)')

2番目の問題は、結果IDをxmlnodelistではなくSQL行として取得する方法です。

4

2 に答える 2

1

for $x in (row) where $x/position() > 10 return ($x)

$x は 10 番目以降のすべての行の子を反復処理しますが、それぞれに対して 1 つの行要素だけを持つ長さ 1 のシーケンスを返すため、$x/position() は常に 1 です。

あなたが使用することができます

row[position() >=10 and position() < 20]

これは、位置 10 から 19 の要素を返します。要素ノードではなく ID のみが必要な場合は、

row[position() >=10 and position() < 20]/string(@id)
于 2013-01-02T07:29:44.010 に答える
1

nodes() メソッドを使用して XML をシュレッドし、value() メソッドを使用して attribute の値を抽出できますid

SQL フィドル

クエリ 1 :

declare @results xml = '
<row id="5083" />
<row id="5085" />
<row id="5087" />
<row id="5090" />
<row id="5094" />'

select T.N.value('@id', 'int') as id
from @results.nodes('row[position() >= 2 and position() < 4]') as T(N)

結果

|   ID |
--------
| 5085 |
| 5087 |
于 2013-01-02T07:36:09.000 に答える