Suponiendo que tiene su XML en una variable de SQL Server llamada @XML
, puede usar el XQuery nativo soporte en SQL Server 2005 y más reciente para hacer esto de manera mucho más elegante y eficiente:
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)
Esto me da una salida de
Con operadores XQuery como .nodes()
o .value()
, puede "triturar" fácilmente un documento XML en datos relacionales y almacenarlos según sea necesario.
La primera llamada a @xml.nodes('//ConditionSet')
obtendrá una tabla "pseudo" para cada nodo coincidente, por lo que cada <ConditionSet>
el nodo se devolverá en la tabla "pseudo" XT
como columna XC
, y luego puedo obtener fácilmente atributos (o elementos XML) de ese fragmento XML usando métodos XQuery como .value()
.
O incluso puedo obtener la lista de subnodos <Condition>
para cada uno de esos <ConditionSet>
nodos - usando CROSS APPLY
con una segunda llamada a .nodes()