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 AUSING 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
laertejunior

