Cláusula ‘OUTPUT’​ – SQL SERVER

A clausula OUTPUT retorna informações ou expressões baseadas em cada linha afetada por uma instrução INSERT, UPDATE, DELETE ou MERGE. É muito útil para guardar as informações das linhas afetadas.

Vamos ver como ela funciona? 

Vamos criar um banco de dados para testes e evitar desastres, criar uma tabela e em seguida popular essa tabela:

CREATE MEUSTESTES;
GO

USE MEUSTESTES;
GO

CREATE TABLE CLIENTE(
  ID   INT IDENTITY,
  NOME  VARCHAR(50),
  SALARIO NUMERIC(10,2)
);
GO

INSERT INTO CLIENTE 
VALUES
   ('RICARDO',1200.00),
   ('JOSÉ',1500.00),
   ('RONALDO',1800.00),
   ('RENATA',2200.00);
GO

A tabela já está criada e populada, precisamos de uma tabela para inserir as modificações sempre que forem feitas na nossa tabela, e assim vermos como funciona o OUTPUT.

Então criaremos outra tabelas com as mesmas características que a tabela que foi criada acima.

CREATE TABLE ALTERACAO_CLIENTE(
  ID INT,
  NOME VARCHAR(50),
  SALARIO NUMERIC(10,2)
); 

Vamos a instrução envolvendo a clausula OUTPUT, observe que existe duas (2) formas de utilizar essa clausula.

Exemplo 1 – Informando os campos a serem gravados:

UPDATE C SET SALARIO = 3000.00
OUTPUT deleted.ID, deleted.NOME, deleted.SALARIO INTO ALTERACAO_CLIENTE
FROM  CLIENTE C
WHERE  ID = 1

Exemplo 2 – como as tabelas são iguais, selecionando todos os campos com *

UPDATE C SET SALARIO = 3000.00
OUTPUT deleted.* INTO ALTERACAO_CLIENTE
FROM  CLIENTE C
WHERE  ID = 1

Observe que a instrução acima, o OUTPUT busca informações da tabela deleted, onde armazena o valor deletado/atualizado na query.

Assim após especificarmos as colunas do OUTPUT, colocamos o INTO para inserir na tabela que criamos os valores de ID, NOME e SALARIO deletados.

SELECT * FROM  ALTERACAO_CLIENTE

Agora vamos utilizar variáveis como exemplo e inserir as alterações da tabela, lembrando que para funcionar corretamente, junto com o bloco delete deve ser selecionado o bloco da variável.

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

Fonte:

http://blog.dbaacademy.com.br/output-sql-server/

https://docs.microsoft.com/pt-br/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15