sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta nodordning i XML-dokument i SQL Server

Du kan emulera position() funktion genom att räkna antalet syskonnoder som föregår varje nod:

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)

Här är resultatuppsättningen:

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

Så fungerar det:

  • för $i i . sats definierar en variabel med namnet $i som innehåller den aktuella noden (. ). Detta är i grunden ett hack för att komma runt XQuerys brist på en XSLT-liknande current() funktion.
  • ../* expression väljer alla syskon (barn till föräldern) till den aktuella noden.
  • [. <<$i] predikat filtrerar listan över syskon till de som föregår (<< ) den aktuella noden ($i ).
  • Vi count() antalet föregående syskon och lägg sedan till 1 för att få positionen. På så sätt tilldelas den första noden (som inte har några föregående syskon) positionen 1.


  1. Där värde i kolumn som innehåller kommaavgränsade värden

  2. MySQL DROP UTLANDSNYCKEL Begränsning

  3. Installera WordPress med WP-CLI

  4. MySQL – ELT() och FILED() funktioner för att extrahera indexposition från listan