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

Find noderækkefølge i XML-dokument i SQL Server

Du kan efterligne position() funktion ved at tælle antallet af søskende noder forud for hver node:

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)

Her er resultatsættet:

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ådan virker det:

  • for $i i . klausul definerer en variabel ved navn $i der indeholder den aktuelle node (. ). Dette er dybest set et hack til at omgå XQuerys mangel på en XSLT-lignende current() funktion.
  • ../* udtryk vælger alle søskende (børn af forælderen) af den aktuelle node.
  • [. <<$i] prædikat filtrerer listen over søskende til dem, der går forud (<< ) den aktuelle node ($i ).
  • Vi count() antallet af forudgående søskende og læg derefter 1 til for at få stillingen. På den måde tildeles den første node (som ikke har nogen forudgående søskende) en position på 1.


  1. Referencer Oracle brugerdefinerede typer over DBLINK?

  2. Hvordan påvirker uforanderlige, stabile og flygtige søgeord funktionsadfærd?

  3. Hukommelsesgrænser i SQL Server 2016 SP1

  4. Hent sidst kendte værdi for hver kolonne i en række