Forudsat at du har din XML i en SQL Server-variabel kaldet @XML
, kan du bruge den native XQuery understøttelse i SQL Server 2005 og nyere for at gøre dette meget mere elegant og effektivt:
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)
Dette giver mig et output på
Med XQuery-operatorer som .nodes()
eller .value()
, kan du nemt "makulere" et XML-dokument til relationelle data og gemme det efter behov.
Det første kald til @xml.nodes('//ConditionSet')
får en "pseudo"-tabel for hver matchende node - så hver <ConditionSet>
node vil blive returneret i "pseudo" tabellen XT
som kolonne XC
, og så kan jeg nemt få fat i attributter (eller XML-elementer) fra det XML-fragment ved hjælp af XQuery-metoder som .value()
.
Eller jeg kan endda få fat i listen over undernoder <Condition>
for hver af disse <ConditionSet>
noder - ved hjælp af CROSS APPLY
med et andet kald til .nodes()