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

Analysieren Sie XML mit mehrstufiger Verschachtelung in SQL

Angenommen, Sie haben Ihr XML in einer SQL Server-Variable namens @XML , können Sie die native XQuery verwenden Unterstützung in SQL Server 2005 und neuer, um dies viel eleganter und effizienter zu tun:

DECLARE @XML XML = '...(your XML here).....' 

SELECT
    RootID = @xml.value('(/Root/@ID)[1]', 'int'),
    ConditionSetOperator = XC.value('@Operator', 'varchar(50)'),
    ConditionID =  XC2.value('@ID', 'int'),
    ConditionOperator = XC2.value('@Operator', 'varchar(50)')
FROM 
    @Xml.nodes('//ConditionSet') AS XT(XC)
CROSS APPLY
    xc.nodes('Condition') AS XT2(XC2)

Dies gibt mir eine Ausgabe von

Mit XQuery-Operatoren wie .nodes() oder .value() , können Sie ein XML-Dokument ganz einfach in relationale Daten „shreddern“ und diese nach Bedarf speichern.

Der erste Aufruf von @xml.nodes('//ConditionSet') erhält eine "Pseudo"-Tabelle für jeden übereinstimmenden Knoten - also jeden <ConditionSet> node wird in der "Pseudo"-Tabelle XT zurückgegeben als Spalte XC , und dann kann ich mithilfe von XQuery-Methoden wie .value() ganz einfach Attribute (oder XML-Elemente) aus diesem XML-Fragment abrufen .

Oder ich kann sogar die Liste der Unterknoten abrufen <Condition> für jeden dieser <ConditionSet> Knoten - mit CROSS APPLY mit einem zweiten Aufruf von .nodes()