sql >> Databáze >  >> RDS >> Sqlserver

Vyhledání pořadí uzlů v dokumentu XML na serveru SQL

Můžete emulovat position() funkce spočítáním počtu sourozeneckých uzlů předcházejících každému uzlu:

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)

Zde je sada výsledků:

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

Jak to funguje:

  • for $i in . klauzule definuje proměnnou s názvem $i který obsahuje aktuální uzel (. ). Toto je v podstatě hack, jak obejít to, že XQuery nemá current() podobné XSLT funkce.
  • ../* výraz vybere všechny sourozence (děti rodiče) aktuálního uzlu.
  • Kód [. << $i] predikát filtruje seznam sourozenců na ty, které předcházejí (<< ) aktuální uzel ($i ).
  • My count() počet předchozích sourozenců a poté přidejte 1, abyste získali pozici. Tímto způsobem je prvnímu uzlu (který nemá žádné předchozí sourozence) přiřazena pozice 1.


  1. Explicitní spojení vs implicitní spojení?

  2. Porovnání s datem v Oracle sql

  3. Cizí klíč ke složenému klíči

  4. Spouštěče prevence