Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Analizza XML con nidificazione multilivello in SQL

Supponendo che tu abbia il tuo XML in una variabile di SQL Server chiamata @XML , puoi utilizzare la XQuery nativa supporto in SQL Server 2005 e versioni successive per farlo in modo molto più elegante ed efficiente:

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)

Questo mi dà un output di

Con operatori XQuery come .nodes() o .value() , puoi facilmente "distruggere" un documento XML in dati relazionali e archiviarli secondo necessità.

La prima chiamata a @xml.nodes('//ConditionSet') otterrà una tabella "pseudo" per ogni nodo corrispondente, quindi ogni <ConditionSet> il nodo verrà restituito nella tabella "pseudo" XT come colonna XC , e quindi posso facilmente acquisire attributi (o elementi XML) da quel frammento XML utilizzando metodi XQuery come .value() .

Oppure posso anche prendere l'elenco dei sottonodi <Condition> per ciascuno di questi <ConditionSet> nodi - utilizzando il CROSS APPLY con una seconda chiamata a .nodes()