Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Suchen der Knotenreihenfolge im XML-Dokument in SQL Server

Sie können position() emulieren Funktion durch Zählen der Anzahl der Geschwisterknoten, die jedem Knoten vorangehen:

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)

Hier ist die Ergebnismenge:

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

So funktioniert es:

  • Der for $i in . -Klausel definiert eine Variable namens $i der den aktuellen Knoten enthält (. ). Dies ist im Grunde ein Hack, um das Fehlen eines XSLT-ähnlichen current() in XQuery zu umgehen Funktion.
  • Der ../* Der Ausdruck wählt alle Geschwister (Kinder des Elternknotens) des aktuellen Knotens aus.
  • Der [. << $i] Prädikat filtert die Liste der Geschwister nach denen, die vorangehen (<< ) der aktuelle Knoten ($i ).
  • Wir count() die Anzahl der vorangehenden Geschwister und addieren Sie dann 1, um die Position zu erhalten. Auf diese Weise wird dem ersten Knoten (der keine vorangehenden Geschwister hat) die Position 1 zugewiesen.