Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Znajdowanie kolejności węzłów w dokumencie XML w SQL Server

Możesz emulować position() funkcja, licząc liczbę węzłów rodzeństwa poprzedzających każdy węzeł:

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)

Oto zestaw wyników:

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 działa:

  • for $i in . klauzula definiuje zmienną o nazwie $i który zawiera bieżący węzeł (. ). Jest to w zasadzie hack mający na celu obejście braku w XQuery podobnej do XSLT current() funkcja.
  • ../* wyrażenie wybiera całe rodzeństwo (dzieci rodzica) bieżącego węzła.
  • [. << $i] predicate filtruje listę rodzeństwa do tych poprzedzających (<< ) bieżący węzeł ($i ).
  • My count() liczbę poprzedzających rodzeństwa, a następnie dodaj 1, aby uzyskać pozycję. W ten sposób pierwszy węzeł (który nie ma poprzedniego rodzeństwa) otrzymuje pozycję 1.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy powinienem używać wbudowanej kolumny varchar(max) czy przechowywać ją w osobnej tabeli?

  2. Rekurencja CTE w celu uzyskania hierarchii drzewa

  3. Podziel ciąg znaków oddzielonych przecinkami i wstaw do tabeli (int)

  4. Ustawienie limitu czasu dla SQL Server

  5. Dlaczego nie mogę użyć aliasu w instrukcji DELETE?