SQL Server 2008 : Merge Statement

by Jenner Maciejewsky 21. agosto 2007 07:31

"Imagine você inserindo alguns dados em uma tabela mas não tem certeza se esses dados já existem ou não."

 

Neste caso o que costumamos fazer é fazer um select na Tabela e caso o registro já exista procedemos com um Update, Delete ou não faremos nada. Para isso podemos fazer via código na aplicação ou até mesmo criar uma Trigger.

 

O Microsoft SQL Server 2008 traz um recurso que permite verifica se o registro já existe na tabela antes de executar um Insert ou Update, eliminando assim algumas linhas de código.

 

Veja o exemplo:

 

Primeiro vamos a um exemplo tradicional. Não que seja a única forma, mas uma delas. Vamos criar uma tabela para atender nossa necessidade.

 

CREATE TABLE PRODUTO(
IDProduto int Primary Key,
Nome varchar(50) NOT NULL,
Valor decimal (18, 2) NULL )

Agora execute a instrução abaixo


Insert into PRODUTO
Select 1,'Notebook', 2200.00
Union All
Select 2,'Teclado', 25.00
Union Al
Select 3,'Mouse Wireless', 30.00
Union All
Select 4,'Roteador', 210.00
Union All
Select 5,'Monitor LCD', 600.00


Considere que o Produto Roteador agora custa 245.00 mas você não sabe se ele já foi inserido ou não.


IF EXISTS (SELECT * FROM PRODUTO WHERE IDPRODUTO = 4)
BEGIN
UPDATE Produto
SET Valor = 245.00
WHERE IDProduto = 4
END
ELSE
BEGIN
INSERT INTO
Produto(IDproduto, Nome, Valor)
Values(4,'Roteador',245.00)
END
 
 
 
Vejamos agora como ficaria utilizando Merge do SQL Server 2008:
 

BEGIN TRAN
DECLARE @IDProduto INT = 4, @Nome VARCHAR(50) = 'Roteador', @Valor Decimal = 245.00

MERGE PRODUTO as Prod
USING (SELECT @IDProduto AS IDProduto, @NOME AS Nome, @Valor as Valor) AS Tb1

ON Prod.IDProduto = Tb1.IDProduto
WHEN MATCHED
THEN UPDATE SET Prod.Valor = Tb1.Valor
WHEN NOT MATCHED
THEN INSERT VALUES(@IDProduto, @Nome, @Valor );

SELECT * FROM Produto
ROLLBACK


Observe que agora no SQL Server 2008 será possível declarar um variável local e ao mesmo tempo atribuir um valor a ela..


Mais informações:


 

Jenner Maciejewsky Rocha
MVP Visual Basic

Tags: , , ,

Blog | Comunidade | General | MSDN | SQL | DICAS

Os comentários estão fechados

Posts Antigos

Awards