sql >> Database >  >> RDS >> Sqlserver

XML ontleden met nesting op meerdere niveaus in SQL

Ervan uitgaande dat u uw XML in een SQL Server-variabele hebt met de naam @XML , kunt u de native XQuery . gebruiken ondersteuning in SQL Server 2005 en nieuwer om dit veel eleganter en efficiënter te doen:

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)

Dit geeft me een output van

Met XQuery-operators zoals .nodes() of .value() , kunt u eenvoudig een XML-document "versnipperen" in relationele gegevens en deze indien nodig opslaan.

De eerste aanroep naar @xml.nodes('//ConditionSet') krijgt een "pseudo"-tabel voor elk overeenkomend knooppunt - dus elke <ConditionSet> node wordt geretourneerd in de "pseudo"-tabel XT als kolom XC , en dan kan ik gemakkelijk attributen (of XML-elementen) uit dat XML-fragment halen met behulp van XQuery-methoden zoals .value() .

Of ik kan zelfs de lijst met subknooppunten <Condition> . pakken voor elk van die <ConditionSet> knooppunten - met behulp van de CROSS APPLY met een tweede aanroep naar .nodes()




  1. Cursor gebruiken in dbMail in sql server 2008

  2. Tekenreeksaaneenschakelingsoperator in Oracle, Postgres en SQL Server

  3. Live zoeken met PHP AJAX en XML

  4. gematerialiseerde weergave periodiek vernieuwen na gre