XQuery – Modificando XML no SQL Server
E ai pessoas, estou de volta esta semana com mais um artigo sobre a utilização do XQuery no SQL Server, sendo este já o terceiro artigo desta série, mostrando como é possível fazer leituras de XML com SQL, gerar XML com XQuery e agora, modificando XML com XQuery.
Para executar modificações em XML com XQuery, precisaremos de dois elementos básicos, sendo o primeiro o método modify() da variável/coluna do tipo XML, e o segundo elemento, no caso de variáveis será o SET, conforme a sintaxe:
SET @VariavelXml.modify('... XQuery ...')
E no caso de colunas será o SET do UPDATE:
UPDATE Tabela SET ColunaXml.modify('... XQuery ...')
Para o nosso primeiro exemplo de XQuery para o método modify, partimos para a alteração do valor de um determinado atributo:
DECLARE @X XML SET @X = ' Nike Puma Freeway ' -- Modificando Id 1 por 4 SET @X.modify('replace value of (//Produto)[1]/@Id with ("4")') --Resultado: -- -- -- Nike -- Puma -- Freeway -- --
E como alterar o texto de determinado elemento ou nó do XML:
-- Modificando Nike por Adidas SET @X.modify('replace value of (//Produto/text())[1] with ("Adidas")') --Resultado: -- -- -- Adidas -- Puma -- Freeway -- --
Utilizando os conceitos de geração de XML por XQuery, vamos criar um novo elemento em nosso XML depois de um determinado nó:
-- Adicionando All Star depois de Freeway SET @X.modify('insert All Star after (//Produto)[3]') --Resultado: -- -- -- Adidas -- Puma -- Freeway -- All Star -- --
E de forma simples, removemos um elemento ou nó:
-- Deletando Puma SET @X.modify('delete (//Produto)[2]') --Resultado: -- -- -- Adidas -- Freeway -- All Star -- --
Criamos um novo elemento ou nó em nosso XML antes de um determinado nó:
-- Adicionando Nike antes de Adidas SET @X.modify('insert Nike before (//Produto)[1]') --Resultado: -- -- -- Nike -- Adidas -- Freeway -- All Star -- --
Criamos como primeiro elemento de um nó:
-- Adicionando Reebok na primeira posição SET @X.modify('insert Reebok as first into (//Armario)[1]') --Resultado: -- -- -- Reebok -- Nike -- Adidas -- Freeway -- All Star -- --
Ou como último elemento, e com um atributo cujo o valor será a função MAX de um determinado caminho + 1 (já complicando um pouco):
-- Adicionando Olympus na última posição com o valor do Id maior + 1 SET @X.modify('insert Olympus as last into (//Armario)[1]') --Resultado: -- -- -- Reebok -- Nike -- Adidas -- Freeway -- All Star -- Olympus -- --
Modificando o atributo do primeiro elemento segundo uma determinada regra:
-- Modificando o Id de Reebok pelo valor do Id maior + 1 SET @X.modify(' replace value of (//Produto)[1]/@Id with ( let $i := max((//Produto)/@Id) return $i + 1 )') --Resultado: -- -- -- Reebok -- Nike -- Adidas -- Freeway -- All Star -- Olympus -- --
Reordenando os elemento, utilizando o conceito do artigo de criação de XML por XQuery e um “for” com “order by”:
-- Gerando um novo XML para ordenação dos Ids SET @X = @X.query(' { for $p in //Produto order by $p/@Id return $p } ') --Resultado: -- -- -- All Star -- Freeway -- Adidas -- Nike -- Olympus -- Reebok -- --
Por fim, inserindo um elemento antes de um determinado elemento que se situa a posição [2]:
-- Adicionando Puma antes de Freeway SET @X.modify('insert Puma before (//Produto)[2]') --Resultado: -- -- -- All Star -- Puma -- Freeway -- Adidas -- Nike -- Olympus -- Reebok -- --
Espero que tenham gostado, pois acabei elaborando uma quantidade relativamente grande de exemplos para demonstrar as principais formas de se utilizar XQuery para modificar um XML no SQL Server, tentando evitar ao máximo de complexidade.
Artigos relacionados:
Iniciando com XQuery – Lendo XML no SQL Server
Iniciando com XQuery – Gerando XML no SQL Server