Olá pessoal, hoje falaremos sobre uma cláusula que sempre estou usando e é muito útil para guardar informações de linhas afetadas por instruções de UPDATE e DELETE.
A cláusula em questão é a OUTPUT, onde podemos guardar informações de linhas afetadas numa tabela ou numa variável de tabela, mostrarei exemplos com os 2 casos.
USE GUIADBA GO CREATE TABLE CLIENTE ( ID INT IDENTITY, NOME VARCHAR(50), SALARIO NUMERIC(10,2) ) INSERT INTO CLIENTE VALUES('RICARDO',1200.00) INSERT INTO CLIENTE VALUES('JOSÉ',1500.00) INSERT INTO CLIENTE VALUES('RONALDO',1800.00) INSERT INTO CLIENTE VALUES('RENATA',2200.00)
Agora vamos ao primeiro exemplo, criando uma tabela para guardar as alterações feitas na Cliente.
CREATE TABLE SALARIOS_ALTERADOS ( ID INT, NOME VARCHAR(50), SALARIO NUMERIC(10,2) )
Execute a instrução:
UPDATE C SET SALARIO = 3000.00 OUTPUT deleted.ID, deleted.NOME, deleted.SALARIO INTO SALARIOS_ALTERADOS FROM CLIENTE C WHERE ID = 1
Observe a instrução acima, o OUTPUT busca informações da deleted e inserted, onde respectivamente um armazena o valor deletado e o valor inserido/atualizado da operação.
Assim após especificarmos as colunas do OUTPUT, colocamos o INTO para inserir na Salarios_Alterados os valores de ID, NOME e SALARIO deletados.
SELECT * FROM SALARIOS_ALTERADOS
Obs.: Como a tabela Clientes e Salarios_Alterados tem o mesmo número de colunas, também poderia escrever a mesma instrução desta forma:
UPDATE C SET SALARIO = 3000.00 OUTPUT deleted.* INTO SALARIOS_ALTERADOS FROM CLIENTE C WHERE ID = 1
Agora vamos ao exemplo, inserindo as alterações numa variável de tabela.
Obs.: Você deve executar junto todo o bloco, da declaração da tabela até o select.
DECLARE @CLIENTES_DELETADOS TABLE ( ID INT, NOME VARCHAR(50), SALARIO NUMERIC(10,2) ) DELETE C OUTPUT deleted.* into @CLIENTES_DELETADOS FROM CLIENTE C WHERE ID = 2 SELECT * FROM @CLIENTES_DELETADOS
Considerações sobre a cláusula OUTPUT + INTO, não pode ser usada para inserção em uma exibição ou função de conjunto de linhas.
EXTRA:
Conseguimos também declarar o OUTPUT numa procedure, onde podemos retornar ou guardar o resultado da mesma numa tabela. Segue um exemplo básico de uma procedure em que soma dois números e armazena o resultado.
Criação da procedure:
CREATE PROCEDURE DBO.SOMAR @N1 INT, @N2 INT, @RESULTADO INT OUTPUT AS SET @RESULTADO = @N1 + @N2 SELECT @RESULTADO AS RESULTADO , GETDATE() AS HR_EXECUCAO INTO RESULTADO_PROC Execução: EXEC DBO.SOMAR 2,2,0 SELECT * FROM RESULTADO_PROC
Gostou deste artigo? Siga nossa página no Facebook e se inscreva em nosso canal do Youtube e receba nossas novidades.
Gostou deste artigo? Então você vai gostar do treinamento Guia DBA que vai tornar você um especialista em otimização, clique aqui e adquira o “Curso SQL Server 2014” e receba também “O passo a passo para otimização”.