Sql-Server

檢查@@ROWCOUNT 失敗

  • September 3, 2020

我的一個 SQL 過程中有一個類似於下面的程式碼,

declare @rowcount int

update table1
set value = @value
where id = @id

select @rowcount = @@ROWCOUNT

if ( @rowcount = 0 )
begin
   insert into table1(id, value1,value2...)
   select (@id, @value1, @value2...)
end 

但它很少失敗,比如一天一次等。這意味著數據存在於表中,@@rowcount 為 0,它試圖插入數據並且發生主鍵衝突。這裡插入的所有值,即。id,value1,value2 等是整數。有什麼想法嗎?

我不確定您為什麼要使用變數,但是您需要使用事務保護多個語句。發生的情況是兩個使用者同時呼叫該過程,都得到 rowcount = 0,然後他們都試圖插入結果。

set transaction isolation level serializable;
begin transaction;

update dbo.table1
 set value = @value
 where id = @id;

if (@@ROWCOUNT = 0)
begin
 insert dbo.table1(id, value1,value2...)
   values(@id, @value1, @value2...);
end 

commit transaction;

自從寫了這個答案後,我在部落格上寫了這個:

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