Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Aplatir le XML hiérarchique en SQL à l'aide de la méthode nodes()

Il semble que j'ai répondu à ma propre question après un peu plus de recherches en ligne :

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)

Utiliser CROSS APPLY Je peux sélectionner le grandparent de niveau supérieur nœud et utilisez-le pour sélectionner l'enfant parent nœuds et ainsi de suite. En utilisant cette méthode, j'ai retiré ma requête de l'exécution en environ 1 minute 30 secondes jusqu'à environ 6 secondes .

Fait intéressant cependant, si j'utilise le "vieux" OPEN XML méthode pour récupérer les mêmes données, la requête s'exécute en 1 seconde !

Il semble que vous devrez peut-être aborder l'utilisation de ces deux techniques au cas par cas en fonction de la taille/complexité attendue du document transmis.