Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Trovare l'ordine dei nodi nel documento XML in SQL Server

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 un current() 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.