Puoi emulare position()
funzione contando il numero di nodi di pari livello che precedono ciascun nodo:
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)
Ecco il set di risultati:
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
Come funziona:
- Il
for $i in .
La clausola definisce una variabile denominata$i
che contiene il nodo corrente (.
). Questo è fondamentalmente un trucco per aggirare la mancanza di XQuery di uncurrent()
simile a XSLT funzione. - Il
../*
espressione seleziona tutti i fratelli (figli del genitore) del nodo corrente. - Il
[. << $i]
predicato filtra l'elenco dei fratelli rispetto a quelli che precedono (<<
) il nodo corrente ($i
). - Noi
count()
il numero dei fratelli precedenti e quindi aggiungere 1 per ottenere la posizione. In questo modo al primo nodo (che non ha fratelli precedenti) viene assegnata una posizione di 1.