Sql-Server-2008

如何處理更新或插入情況

  • February 2, 2017

有時我的儲存過程看起來像

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 

呼叫此儲存過程的應用程序設計可能存在錯誤。

我是否應該避免製作執行相同儲存過程和方法來插入新數據並更新舊數據的應用程序?

有沒有更好的方法以一種方法實現更新或插入數據?

我正在使用 SQL Server 2005 / 2008。

一種更有效的方法(最壞的情況是對現有數據進行一次搜尋/掃描,而不是兩次):

UPDATE dbo.whatever SET ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
 INSERT dbo.whatever ...
END

MERGE可能很誘人,但是有幾個原因我會迴避它。

  1. 語法令人生畏且難以記憶
  2. 除非您有意添加特定的鎖定提示,否則您不會獲得比上述方法更多的並發性
  3. 有許多未解決的錯誤,MERGE可能還有更多尚未發現的錯誤

引用自:https://dba.stackexchange.com/questions/39703