sql >> Base de Datos >  >> RDS >> Sqlserver

Aplanando XML jerárquico en SQL usando el método nodes()

Parece que respondí mi propia pregunta después de buscar un poco más en línea:

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 Puedo seleccionar el grandparent de nivel superior nodo y use esto para seleccionar el hijo parent nodos y así sucesivamente. Con este método, he evitado que mi consulta se ejecute en alrededor de 1 minuto y 30 segundos hasta alrededor de 6 segundos .

Curiosamente, sin embargo, si uso el "antiguo" OPEN XML método para recuperar los mismos datos, la consulta se ejecuta en 1 segundo !

Parece que es posible que deba abordar el uso de estas dos técnicas caso por caso, según el tamaño/complejidad esperados del documento que se está transfiriendo.