De vez em quando, meus procedimentos armazenados parecem
create procedure handle_data
@fk int,
@value varchar(10)
as
begin
if exists (select * from my_table where id = @fk)
begin
update my_table
set value = @value
where id = @fk
end
else
begin
insert into my_table (fk, value)
select @fk, @value
end
end
Provavelmente há falha no design do aplicativo que chama esse procedimento armazenado.
Devo evitar fazer aplicativos que executam o mesmo procedimento armazenado e métodos para inserir novos dados e também atualizar os antigos?
Existe uma maneira melhor de atualizar ou inserir dados em uma abordagem?
Estou usando o SQL Server 2005/2008.
Uma maneira um pouco mais eficiente (que fará, na pior das hipóteses, uma busca/varredura em vez de duas contra os dados existentes):
MERGE
pode ser tentador, no entanto, há algumas razões pelas quais eu evito isso.MERGE
e provavelmente muitos mais que ainda não foram descobertosA instrução MERGE permitirá que você execute um comando,
Mais informações sobre mesclagem podem ser encontradas neste artigo no MSDN
A
MERGE
instrução foi introduzida no SQL Server 2008 para lidar exatamente com essa situação.