Możesz emulować position()
funkcja, licząc liczbę węzłów rodzeństwa poprzedzających każdy węzeł:
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)
Oto zestaw wyników:
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
Jak to działa:
for $i in .
klauzula definiuje zmienną o nazwie$i
który zawiera bieżący węzeł (.
). Jest to w zasadzie hack mający na celu obejście braku w XQuery podobnej do XSLTcurrent()
funkcja.../*
wyrażenie wybiera całe rodzeństwo (dzieci rodzica) bieżącego węzła.[. << $i]
predicate filtruje listę rodzeństwa do tych poprzedzających (<<
) bieżący węzeł ($i
).- My
count()
liczbę poprzedzających rodzeństwa, a następnie dodaj 1, aby uzyskać pozycję. W ten sposób pierwszy węzeł (który nie ma poprzedniego rodzeństwa) otrzymuje pozycję 1.