如何处理更新或插入情况

ado*_*lot 1 sql-server-2008 database-design insert t-sql update

有时我的存储过程看起来像

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 
Run Code Online (Sandbox Code Playgroud)

调用此存储过程的应用程序设计可能存在错误。
我应该避免制作执行相同存储过程和方法来插入新数据并更新旧数据的应用程序吗?

有没有更好的方法来以一种方法实现更新或插入数据?

我正在使用 SQL Server 2005 / 2008。

Aar*_*and 5

一种稍微更有效的方法(最坏的情况是对现有数据执行一次搜索/扫描,而不是两次):

UPDATE dbo.whatever SET ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
  INSERT dbo.whatever ...
END
Run Code Online (Sandbox Code Playgroud)

MERGE 可能很诱人,但有几个原因让我回避它。

  1. 语法令人生畏且难以记住
  2. 除非您有意添加特定的锁定提示,否则您不会获得比上述方法更多的并发性
  3. 有许多未解决的错误,MERGE可能还有更多尚未发现