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