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: