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

Conversione dell'XML gerarchico in SQL utilizzando il metodo nodes()

Mi sembra di aver risposto alla mia stessa domanda dopo aver guardato un po' più in giro online:

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)

Utilizzando CROSS APPLY Posso selezionare il grandparent di livello superiore nodo e usalo per selezionare il figlio parent nodi e così via. Utilizzando questo metodo ho impedito l'esecuzione della mia query in circa 1 minuto e 30 secondi fino a circa 6 secondi .

È interessante notare però che se utilizzo il "vecchio" OPEN XML metodo per recuperare gli stessi dati, la query viene eseguita in 1 secondo !

Sembra che potresti dover affrontare l'uso di queste due tecniche caso per caso, a seconda delle dimensioni/complessità previste del documento che viene passato.