Zakładając, że masz swój kod XML w zmiennej SQL Server o nazwie @XML
, możesz użyć natywnego XQuery wsparcie w SQL Server 2005 i nowszych, aby zrobić to znacznie bardziej elegancko i wydajnie:
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)
Daje mi to wynik
Z operatorami XQuery, takimi jak .nodes()
lub .value()
, możesz łatwo "rozdrobnić" dokument XML na dane relacyjne i przechowywać je w razie potrzeby.
Pierwsze wywołanie @xml.nodes('//ConditionSet')
otrzyma tabelę "pseudo" dla każdego pasującego węzła - więc każdy <ConditionSet>
node zostanie zwrócony w tabeli "pseudo" XT
jako kolumna XC
, a następnie mogę łatwo pobrać atrybuty (lub elementy XML) z tego fragmentu XML za pomocą metod XQuery, takich jak .value()
.
Lub mogę nawet pobrać listę podwęzłów <Condition>
dla każdego z tych <ConditionSet>
węzły - za pomocą CROSS APPLY
z drugim wywołaniem .nodes()