Inclusão em massa no SQL Server evitando cursores

Estava visualizando as atualizações do Facebook quando vi um post do Diego Nogare com um título que me chamou muita atenção “Edição #44 – Inclusão em massa no SQL Server evitando cursores“, logo, entrei no YouTube para ver o video e gostei muito, com isso, resolvi compartilhar com os seguidores do t-sql, vale muito a pena assistir, o video tem participação do Diego Nogare e quem das as dicas na prática é o Daniel Santos.

Apenas estou compartilhando o video, todos os créditos do mesmo são de:

Daniel Santos e Diego Nogare.

 

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 fazer um INSERT com EXEC

Como fazer um INSERT com EXEC, é isso mesmo um insert com uma procedure.

Você utiliza a instrução “INSERT SELECT” para inserir os dados resultantes de uma determinada frase sql em uma tabela de destino.

A instução “INSERT EXEC” é semelhante a instrução citada acima, porém no lugar do “SELECT“, você utiliza o “EXEC“.

Vamos ao exemplo de como fazer:

Tabelas que serão utilizadas para nosso exemplo.

CREATE TABLE T_ESTADO
(
   UF VARCHAR(2),
   ESTADO VARCHAR(50)
);

CREATE TABLE T_UF
(
  UF VARCHAR(2)
);

Observação: Não me preocupei com índice e chave nas tabelas, pois apenas criei para o nosso exemplo.

Após criarmos as tabelas utilizadas em nosso exemplo, vamos popular a mesma.

INSERT INTO T_ESTADO (UF, ESTADO)
VALUES
('SP','SÃO PAULO'),
('AC', 'ACRE'),
('CE', 'CEARÁ'),
('GO','GOIÁS');

Agora vamos criar procedure que iremos utilizar no nosso exemplo de “INSERT EXEC“.

CREATE PROCEDURE P_ESTADO @ESTADO AS VARCHAR(50)
AS
SELECT UF FROM T_ESTADO
 WHERE ESTADO = @ESTADO;

Vamos fazer o nosso insert utilizando a instrução “INSERT EXEC“.

INSERT INTO T_UF (UF)
EXEC P_ESTADO 'ACRE';

Resultado do nosso insert:

Resultado

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.