Fazendo uso da tabela temporária INSERTED dentro de uma trigger no SQL Server

O objetivo desse post é mostrar como utilizar o “INSERTED” do SQL Server em triggers do banco de dados.

Primeiramente, vamos criar a tabela para cuja qual iremos utilizar em nosso exemplo.


CREATE TABLE T_SQL

(

CODIGO INT IDENTITY (1,1),

DESCRICAO VARCHAR(50)

);

Pronto à tabela de exemplo foi criada, agora vamos a criar a trigger.


CREATE TRIGGER T_SQL_FI ON T_SQL

FOR INSERT  AS

SELECT 'TESTE INSERT CAPTURANDO INSERTD SQL SERVER T-SQL.COM.BR',

INS.* FROM INSERTED INS

GO

A trigger foi criada, agora todas a vez que for realizado um insert na tabela criada para exemplo haverá um retorno da coluna que foi definida com um texto fixo mais os campos da tabela em que o insert foi realizado.

Vamos fazer um insert na tabela “T_SQL”, para que seja possível visualizarmos o que foi dito acima na prática.


INSERT INTO T_SQL (DESCRICAO) VALUES

('T-SQL.COM.BR'),

('T-SQL');

O retorno que teremos será o seguinte:

T-SQL_001

Agora vocês me perguntam onde podemos fazer a utilização desse tipo de trigger?

Um exemplo simples é um log, por exemplo, toda vez que a tabela tiver um insert ela irá gravar em uma tabela  de log qual horário que foi realizado o insert e o que foi inserido na tabela.

Vamos fazer um exemplo da trigger do inserted para fim de gravar log’s.

Iremos criar primeiramente nossa tabela de log’s.


CREATE TABLE T_SQL_LOG

(

CD_LOG INT IDENTITY (1,1),

DS_LOG VARCHAR(4000),

TP_LOG VARCHAR(23),

DT_LOG DATETIME

);

Agora que a tabela foi criada, vamos fazer as alterações necessárias  para que a tabela de log criada seja alimentada pela trigger criada anteriormente.


ALTER TRIGGER T_SQL_FI ON T_SQL

FOR INSERT

AS

INSERT INTO T_SQL_LOG (DS_LOG, TP_LOG, DT_LOG)
SELECT CAST(INS.CODIGO AS VARCHAR) + ' - ' + INS.DESCRICAO,
       'INSERT',
       GETDATE()
FROM INSERTED INS

GO

Pronto agora vamos fazer o insert e ver o resultado da nossa trigger sendo utilizada como log.


INSERT INTO T_SQL (DESCRICAO) VALUES

('T-SQL.COM.BR'),

('T-SQL');

Após o insert, vamos fazer um select na tabela de log e ver o resultado.


SELECT * FROM T_SQL_LOG

T-SQL_002

Lógico que o que foi falado nesse post é algo bem simples mais para ilustrar de como pode-se fazer a utilização do INSERTED nas triggers.

Como posso identificar registros duplicados em uma tabela?

Como posso identificar registros duplicados em uma tabela?

Para identificar registros duplicados em uma tabela, você vai usar o GROUP BY cláusula da instrução SELECT. Vamos  criar a tabela e inserir os dados para que possamos ver como fazer. Sua instrução SQL ficará da seguinte forma:

CRIANDO TABELA E INSERINDO OS DADOS:


CREATE TABLE T_REGISTRODUPLICADO
(
 CODIGO INT NOT NULL,
 DESCRICAO VARCHAR(50)
);

INSERT INTO T_REGISTRODUPLICADO (CODIGO,DESCRICAO) VALUES (1, 'REGISTRO 1');
INSERT INTO T_REGISTRODUPLICADO (CODIGO,DESCRICAO) VALUES (2, 'REGISTRO 2');
INSERT INTO T_REGISTRODUPLICADO (CODIGO,DESCRICAO) VALUES (3, 'REGISTRO 3');
INSERT INTO T_REGISTRODUPLICADO (CODIGO,DESCRICAO) VALUES (1, 'REGISTRO 1');
INSERT INTO T_REGISTRODUPLICADO (CODIGO,DESCRICAO) VALUES (1, 'REGISTRO 1');
INSERT INTO T_REGISTRODUPLICADO (CODIGO,DESCRICAO) VALUES (1, 'REGISTRO 1');

Como ver os registros duplicados:


SELECT CODIGO, DESCRICAO FROM T_REGISTRODUPLICADO
GROUP BY CODIGO, DESCRICAO
HAVING COUNT(*)>1

Esta consulta irá lhe retornar os registros duplicados com base no código e descrição. Se você quer saber quantas vezes esses registros são duplicados na tabela, você pode simplesmente incluir o COUNT (*) na saída:


SELECT CODIGO, DESCRICAO, COUNT(*) FROM T_REGISTRODUPLICADO
GROUP BY CODIGO, DESCRICAO
HAVING COUNT(*)>1

Se você quer o resultado ordenado pela combinação mais duplicado do código e descrição, você pode incluir a cláusula ORDER BY da seguinte forma:


SELECT CODIGO, DESCRICAO, COUNT(*) FROM T_REGISTRODUPLICADO
GROUP BY CODIGO, DESCRICAO
HAVING COUNT(*)>1
ORDER BY COUNT(*) DESC

Faça o download do arquivo de exemplo clicando no link: registrosduplicados

Insert com informações do Excel

No post anterior mostramos como realizar o insert criando a tabela de acordo com as colunas do Excel.

Agora vamos mostrar como fazer o insert das informações do Excel em uma tabela já existente em nosso banco de dados.

Primeiro vamos criar nossa tabela conforme o código abaixo.


CREATE TABLE [dbo].[CADASTRO](
 [NOME] [nvarchar](255) NULL,
 [SOBRENOME] [nvarchar](255) NULL,
 [RG] [float] NULL,
 [CPF] [float] NULL,
 [DATANASC] [datetime] NULL
) ON [PRIMARY]

GO

Após criar tabela devemos nos certificar que nosso arquivo já está pronto para importamos.


Pronto, agora vamos realizar o insert.

INSERT INTO CADASTRO
 SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database=c:CAD.xls',
 'SELECT * FROM [CAD$]')

Pronto, insert realizado com sucesso.