Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Analyser XML avec une imbrication à plusieurs niveaux dans SQL

En supposant que vous ayez votre XML dans une variable SQL Server appelée @XML , vous pouvez utiliser le XQuery natif prise en charge dans SQL Server 2005 et versions ultérieures pour le faire de manière beaucoup plus élégante et efficace :

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)

Cela me donne une sortie de

Avec les opérateurs XQuery comme .nodes() ou .value() , vous pouvez facilement "déchiqueter" un document XML en données relationnelles et les stocker selon vos besoins.

Le premier appel à @xml.nodes('//ConditionSet') obtiendra une "pseudo" table pour chaque nœud correspondant - donc chaque <ConditionSet> le noeud sera retourné dans la "pseudo" table XT comme colonne XC , puis je peux facilement récupérer des attributs (ou des éléments XML) à partir de ce fragment XML en utilisant des méthodes XQuery comme .value() .

Ou je peux même saisir la liste des sous-nœuds <Condition> pour chacun de ces <ConditionSet> nœuds - en utilisant le CROSS APPLY avec un second appel à .nodes()