Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изравняване на йерархичен XML в SQL с помощта на метода nodes().

Изглежда, че отговорих на собствения си въпрос след малко повече разглеждане онлайн:

SELECT
    grandparent.gname.value('@name', 'VARCHAR(15)'),
    parent.pname.value('@name', 'VARCHAR(15)'),
    child.cname.value('@name', 'VARCHAR(15)')
FROM
    @xmlFamilyTree.nodes('/grandparent') AS grandparent(gname)
CROSS APPLY
    grandparent.gname.nodes('*') AS parent(pname)
CROSS APPLY
    parent.pname.nodes('children/*') AS child(cname)

Използване на CROSS APPLY Мога да избера grandparent от най-високо ниво възел и използвайте това, за да изберете дъщерния parent възли и така нататък. Използвайки този метод, спрях изпълнението на заявката си за около 1 минута и 30 секунди до около 6 секунди .

Интересно е обаче, че ако използвам "стария" OPEN XML метод за извличане на същите данни, заявката се изпълнява за 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. 2 начина за създаване на база данни на свързан сървър с помощта на T-SQL

  2. Получаване на произволна стойност от диапазон в MS SQL?

  3. SQL Как да определите дали датата на месеца съдържа 29, 30 или 31

  4. Премахване на дубликати с помощта на дял от SQL Server

  5. Добавете колона към съществуваща таблица и ги номерирайте уникално в MS SQL Server