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

Spłaszczanie hierarchicznego XML w SQL za pomocą metody nodes()

Wydaje mi się, że po dłuższym rozglądaniu się w Internecie odpowiedziałem na własne pytanie:

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)

Korzystanie z CROSS APPLY Mogę wybrać grandparent najwyższego poziomu węzła i użyj go, aby wybrać potomnego parent węzły i tak dalej. Korzystając z tej metody, wykonałem moje zapytanie w około 1 minutę 30 sekund do około 6 sekund .

Co ciekawe, jeśli użyję "starego" OPEN XML metoda pobierania tych samych danych, zapytanie jest wykonywane w 1 sekundę !

Wygląda na to, że być może będziesz musiał podejść do tych dwóch technik indywidualnie, w zależności od oczekiwanego rozmiaru/złożoności przekazywanego dokumentu.




  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 zawijanie kolumn dopuszczających wartość null w ISNULL powoduje skanowanie tabel?

  2. Jaki jest najbardziej odpowiedni typ danych do przechowywania adresu IP na serwerze SQL?

  3. Transpozycja wierszy do kolumn na podstawie kolumny ID

  4. Aktualizowanie UsageTime w SQL Server za pomocą Visual Studio

  5. Problem serializacji C# i SQL Server 2008 CLR