Můžete emulovat position()
funkce spočítáním počtu sourozeneckých uzlů předcházejících každému uzlu:
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)
Zde je sada výsledků:
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 funguje:
for $i in .
klauzule definuje proměnnou s názvem$i
který obsahuje aktuální uzel (.
). Toto je v podstatě hack, jak obejít to, že XQuery nemácurrent()
podobné XSLT funkce.../*
výraz vybere všechny sourozence (děti rodiče) aktuálního uzlu.- Kód
[. << $i]
predikát filtruje seznam sourozenců na ty, které předcházejí (<<
) aktuální uzel ($i
). - My
count()
počet předchozích sourozenců a poté přidejte 1, abyste získali pozici. Tímto způsobem je prvnímu uzlu (který nemá žádné předchozí sourozence) přiřazena pozice 1.