Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Analisar XML com aninhamento multinível em SQL


Supondo que você tenha seu XML em uma variável do SQL Server chamada @XML , você pode usar o XQuery nativo suporte no SQL Server 2005 e mais recente para fazer isso de forma muito mais elegante e 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)

Isso me dá uma saída de



Com operadores XQuery como .nodes() ou .value() , você pode facilmente "fragmentar" um documento XML em dados relacionais e armazená-los conforme necessário.

A primeira chamada para @xml.nodes('//ConditionSet') obterá uma tabela "pseudo" para cada nó correspondente - portanto, cada <ConditionSet> o nó será retornado na tabela "pseudo" XT como coluna XC , e então eu posso facilmente pegar atributos (ou elementos XML) desse fragmento XML usando métodos XQuery como .value() .

Ou posso até pegar a lista de subnós <Condition> para cada um desses <ConditionSet> nós - usando o CROSS APPLY com uma segunda chamada para .nodes()