Update no que existe, insert no que não existe ( Uso do Output e Merge)


 

Pessoal, algumas  vezes nos deparamos com a situação: tenho uma Tabela A (codigo,valor), tenho uma Tabela B(codigo ,valor). Para cada linha de A, procurar na B pelo codigo. Se existir atualizar o campo Valor. Se não existir inserir a linha (codigo,valor). Em um processamento row based usariamos um cursor ou um while e eu acredito que a galera que me conhece sabe meu pensamento sobre isso, então vela aqui dois exemplos de resolução set based (sem cursores ou whiles)…

No SQL SERVER 2005 e 2008 temos a clausula OUTPUT (procure por output no BOL)  que no nosso caso vai diminuir o range para o insert caso nao exista. Uma outra utilização é que se fossemos trabalhar com esta idéia, nunca poderiamos inserir primeiro e atualizar depois, pois o update contemplaria também os dados inseridos e não quero isso. Com a clausula OUTPUT eu posso fazer, pois jogaria os que foram inseridos na tabela @table e depois atualizaria os que não existirem nela.

Vamos ver ?

Tabela A (codigo int, valor numeric(10,2))
Tabela B (codigo int, valor numeric(10,2))

declare @updated_codigo table(codigo int )
UPDATE b SET b.valor += a.valor, b.msg = ‘Alterada’
OUTPU inserted.codigo INTO @updated_codigo
FROM TesteOutput A, TesteOutput_2 B
WHERE a.codigo=B.codigo

INSERT INTO TesteOutput_2 SELECT codigo,valor,’inserida’
FROM TesteOutput A
WHERE not exists(select 1 from @updated_codigo B where A.codigo = B.codigo)

Reparem que joguei a saida para uma tabela chamada @updated_codigo , ou seja, as linhas que foram afetadas pelo update estão nesta tabela. Depois é feito um insert das linhas que não existem entre a tabela A e a de saida (@updated_codigo)

Assim foi feito um update no que existe e um insert no que não existe.

No SQL SERVER 2008 podemo usar o statment  MERGE. Aqui no caso veremos somente um insert e um update, mas este comando é bem mais poderoso (procurem no BOL por Merge – TSQL).

MERGE TESTEOUTPUT_2 AS A
USING TESTEOUTPUT AS B
ON (A.CODIGO = B.CODIGO)
WHEN MATCHED
THEN UPDATE SET A.VALOR += B.VALOR, A.MSG = ‘ALTERADA’
WHEN NOT MATCHED THEN
INSERT (CODIGO, VALOR,MSG)
VALUES (B.CODIGO, B.VALOR,’INSERIDA’);

Duas maneiras de se trabalhar com o update no que existe e insere no que não existe ou ao contrário.

Abraços

About Laerte Junior

Laerte Junior Laerte Junior is a SQL Server specialist and an active member of WW SQL Server and the Windows PowerShell community. He also is a huge Star Wars fan (yes, he has the Darth Vader´s Helmet with the voice changer). He has a passion for DC comics and living the simple life. "May The Force be with all of us"
This entry was posted in SQL SERVER EM GERAL. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s