Imagine que haja uma operação de update no banco e ao final dela, você deseja avaliar o resultado gerado e o que ela modificou naquela tabela que sofreu a operação. Normalmente nesse tipo de trabalho, ao final, executamos um select para conferir e após, garantimos com commit ou rollback.
E se houver uma forma de gerar o resultado como se fosse um select mas sem precisar executar um novo comando? E sobre esse recurso que este post irá tratar, a cláusula OUTPUT.
Esta cláusula funciona como um select ao final de dada operação e é possível avaliar como esta operação se comportou e se a transação foi bem sucedida ou não.
CLÁUSULA OUTPUT
Como dito esta cláusula age como um select gerando resultado porém o que ela faz é nos dar a saída do que foi feito num grupo de comando retornando o atributo daquela linha modificada.
Logicamente ela é bem similar ao select, mas para seu uso, precisamos especificar alguns parâmetros quando vamos utilizá-la:
- Ser por exemplo quisermos utilizar para saída de um comando INSERT: INSERTED
- Se formos usar para saída de uma operação de DELETE: DELETED
Agora, quando vamos utilizar com uma transação de update, temos uma pequena alteração pois neste comando podemos retornar os valores pré ou pós-update.
· Pré-update: deleted
· Pós-update: inserted
Outra grande vantagem para esta cláusula é a sua facilidade para criar tabelas de auditoria e armazenar as operações no banco facilitando resolução de problemas e até mesmo comparação entre os valores.
Se o insert fosse realizado sem output, receberíamos apenas a mensagem de execução e quantas linhas foram inseridas.
E se por um acaso quisermos armazenar esses históricos em uma tabela qualquer para possíveis auditorias ou comparações? É isso que vamos ver no próximo exemplo onde iremos armazenar os inserts dentro de uma tabela temporária.
Por ser uma tabela temporária declarada, selecione e execute todo o bloco de comando de uma única vez.
Nem sempre o output irá gerar valor de saída para uma transação. Quando armazenamos essas saídas em uma tabela, ele funciona como um insert normal e retorna apenas a mensagem de operação com sucesso. Veja o exemplo abaixo:
Se desejar que a cláusula output ainda assim retorne valores inseridos ou deletados, faça a seguinte operação:
Para o delete a lógica é basicamente a mesma mudando apenas o parâmetro passado no output. Veja abaixo.
UPDATE COM OUPUT
Uma boa característica que o update permite é criar uma tabela para controle de atualização conforme necessidade e nela podemos inserir os valores antigos e novos e assim, facilitar o registro histórico.
No exemplo abaixo eu criei uma tabela para auditoria das mudanças de preço dos produtos incluindo a data e hora que a mudança foi executada.
Este é o resultado final com uma consulta feita na tabela de auditoria criada, essa chamada de upd_prodaudit. Veja que temos inclusive o exato momento que a atualização foi executada. Isto também pode ser feito por Trigger (será visto em momento posterior).
MERGE COM OUTPUT
Como todo grupo de comando em DML, podemos utilizar output com merge desde que especifiquemos qual operação feita no bloco de comando irá retornar saída.
Um fato interessante na cláusula merge é que aqui podemos especificar uma ação no output que retorna para o usuário que tipo de operação foi realizada.
Vamos realizar uma operação de merge básica para entender como funciona: Veja.
OUTPUT COM QUERY ANINHADA
E por último temos como utilizar a cláusula output dentro de uma subquery para inserir a saída na tabela de auditoria.
Esse tipo de manipulação é uma forma de visualizar os resultados gerados após uma função do grupo DML com a cláusula output onde passamos para uma tabela de controle somente uma amostra do resultado gerado nesta operação.
vamos supor que precisamos atualizar o preço dos produtos aumentando em 15% seu valor, porém somente aqueles que possuem um preço maior que 20.
Neste post quis mostrar uma forma de realizar correções e troubleshooting em queries que alteram de alguma forma uma tabela no banco de dados.
Este recurso pode lhe ajudar muito tanto em manter um histórico de atualização quando para evitar que certos valores sejam modificados indevidamente.
Particularmente curti muito e tentarei usar sempre que possível e espero que também tenham gostado.
Saúde!