position()
をエミュレートできます 各ノードの前にある兄弟ノードの数を数えることで機能します:
SELECT
code = value.value('@code', 'int'),
parent_code = value.value('../@code', 'int'),
ord = value.value('for $i in . return count(../*[. << $i]) + 1', 'int')
FROM @Xml.nodes('//value') AS T(value)
結果セットは次のとおりです。
code parent_code ord
---- ----------- ---
1 NULL 1
11 1 1
111 11 1
12 1 2
121 12 1
1211 121 1
1212 121 2
仕組み:
- $iの
for $i in .
句は、$i
という名前の変数を定義します 現在のノード(for $i in .
)。これは基本的に、XQueryにXSLTのようなcurrent()
がないことを回避するためのハックです。 機能。 -
../*
式は、現在のノードのすべての兄弟(親の子)を選択します。 [. << $i]
述語は、兄弟のリストを前の兄弟のリストにフィルターします(<<
)現在のノード($i
。-
count()
先行する兄弟の数を入力し、1を加算して位置を取得します。このようにして、最初のノード(先行する兄弟がない)に1の位置が割り当てられます。