XQuery – Gerando XML no SQL Server
Além das artes de geração de XML pela clausula FOR XML e por técnicas menos renomadas com CAST/CONVERT, ainda temos uma participação não muito conhecida, mas demonstra o potencial do XQuery que não se limita a leitura e a modificação de dados XML.
Para inicio de conversa, precisaremos de uma variável XML não nula (em cenários reais, é comum utilizar variáveis ou colunas com dados XML, tanto para geração ou manipulação destes dados para geração de XML em um novo formato), e de forma simples gerar alguns XMLs com XQuery:
DECLARE @X XML
SET @X = ''
-- Definição de XML para gerar XML
SELECT @X.query('
<Estoque>
<Armario>
<Produto Id="1">Nike</Produto>
<Produto Id="2">Puma</Produto>
<Produto Id="3">Freeway</Produto>
</Armario>
</Estoque>
')
-- Definição de elementos para gerar XML
SELECT @X.query('
element Estoque {
element Armario {
element Produto {
text {"Nike"},
attribute Id { 1 }
},
element Produto {
text {"Puma"},
attribute Id { 2 }
},
element Produto {
text {"Freeway"},
attribute Id { 3 }
}
}
}
')
-- Definição mista para gerar XML
SELECT @X.query('
element Estoque {
<Armario>
<Produto Id="1">Nike</Produto>
{
element Produto {
text {"Puma"},
attribute Id { 2 }
}
}
<Produto Id="3">Freeway</Produto>
</Armario>
}
')
--Resultado:
--<Estoque>
-- <Armario>
-- <Produto Id="1">Nike</Produto>
-- <Produto Id="2">Puma</Produto>
-- <Produto Id="3">Freeway</Produto>
-- </Armario>
--</Estoque>
Também demonstrando a possibilidade de utilizar variáveis:
DECLARE @X XML
SET @X = ''
DECLARE @I INT
SET @I = 10
-- Recuperando uma variável
SELECT @X.query('sql:variable("@I")')
--Resultado:
--10
-- Recuperando uma variável para geração de XML
SELECT @X.query('
<Tipo>
{sql:variable("@I")}
</Tipo>')
SELECT @X.query('element Tipo {sql:variable("@I")}')
--Resultado:
--<Tipo>10</Tipo>
E colunas de uma dada consulta:
DECLARE @X XML
SET @X = ''
-- Recuperando uma coluna
SELECT TOP 3
@X.query('sql:column("name")')
FROM sys.types
--Resultado:
--bigint
--binary
--bit
-- Recuperando uma coluna para geração de XML
SELECT TOP 3
@X.query('
<Tipo>
{sql:column("name")}
</Tipo>')
FROM sys.types
SELECT TOP 3
@X.query('element Tipo {sql:column("name")}')
FROM sys.types
--Resultado:
--<Tipo>bigint</Tipo>
--<Tipo>binary</Tipo>
--<Tipo>bit</Tipo>
Please follow and like us:
