Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Recherche de l'ordre des nœuds dans un document XML dans SQL Server

Vous pouvez émuler la position() fonction en comptant le nombre de nœuds frères précédant chaque nœud :

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)

Voici le jeu de résultats :

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

Comment ça marche :

  • Le for $i in . la clause définit une variable nommée $i qui contient le nœud courant (. ). Il s'agit essentiellement d'un hack pour contourner le manque de XQuery d'un current() de type XSLT fonction.
  • Le ../* expression sélectionne tous les frères et sœurs (enfants du parent) du nœud actuel.
  • Le [. << $i] le prédicat filtre la liste des frères et sœurs à ceux qui précèdent (<< ) le nœud courant ($i ).
  • Nous count() le nombre de frères et sœurs précédents, puis ajoutez 1 pour obtenir la position. De cette façon, le premier nœud (qui n'a pas de frères et sœurs précédents) se voit attribuer une position de 1.