Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Abflachen von hierarchischem XML in SQL mithilfe der nodes()-Methode

Ich scheine meine eigene Frage beantwortet zu haben, nachdem ich mich ein bisschen online umgesehen habe:

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)

Mit CROSS APPLY Ich kann den grandparent der obersten Ebene auswählen -Knoten und verwenden Sie diesen, um das untergeordnete parent auszuwählen Knoten und so weiter. Mit dieser Methode habe ich meine Abfrage in etwa 1 Minute 30 Sekunden ausgeführt auf etwa 6 Sekunden reduziert .

Interessanterweise aber, wenn ich das "alte" OPEN XML verwende Methode zum Abrufen derselben Daten, wird die Abfrage in 1 Sekunde ausgeführt !

Es scheint, als müssten Sie die Verwendung dieser beiden Techniken von Fall zu Fall in Abhängigkeit von der erwarteten Größe/Komplexität des einzureichenden Dokuments angehen.