Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Achatando XML hierárquico em SQL usando o método nodes()


Parece que respondi minha própria pergunta depois de pesquisar um pouco mais on-line:
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)

Usando CROSS APPLY Posso selecionar o grandparent de nível superior nó e use isso para selecionar o filho parent nós e assim por diante. Usando esse método, tirei minha consulta da execução em cerca de 1 minuto e 30 segundos até cerca de 6 segundos .

Curiosamente, porém, se eu usar o "antigo" OPEN XML método para recuperar os mesmos dados, a consulta é executada em 1 segundo !

Parece que você pode ter que abordar o uso dessas duas técnicas caso a caso, dependendo do tamanho/complexidade esperado do documento que está sendo transmitido.