sql >> Base de Datos >  >> RDS >> Sqlserver

Analizar XML con anidamiento multinivel en SQL

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