sql >> Databasteknik >  >> RDS >> Sqlserver

Plattning av hierarkisk XML i SQL med metoden nodes().

Jag verkar ha svarat på min egen fråga efter att ha kollat ​​lite mer på nätet:

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)

Använder CROSS APPLY Jag kan välja grandparent på översta nivån nod och använd denna för att välja den underordnade parent noder och så vidare. Med den här metoden har jag tagit min fråga från att köras på cirka 1 minut och 30 sekunder ner till cirka 6 sekunder .

Intressant dock om jag använder den "gamla" OPEN XML metod för att hämta samma data, körs frågan på 1 sekund !

Det verkar som om du kanske måste närma dig användningen av dessa två tekniker från fall till fall beroende på den förväntade storleken/komplexiteten hos dokumentet som skickas in.




  1. Konstig tidszonshantering i en Postgres-databas

  2. T-SQL kunde inte återställas

  3. Erhålla primärnyckeln från en infogat datauppsättning för att kedja in i andra infogningar

  4. sudo yum installera php55w-mysqlnd konflikt