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()