2010-02-15 135 views
2

在我的存儲過程中,我想檢查一下以確保我試圖插入的內容不存在於表中。我已經嘗試了下面的代碼,但它似乎給了我誤報(即使它不在表格中也是如此)。有沒有更好的辦法?插入存儲過程之前檢查是否存在

if not exists (select myID from tableName where myID = @myID and otherColumn = @otherColumn) 
begin 
    insert into tableName 
     (
      myID 
      , otherColumn 
     ) values (
      @myID 
      , @otherColumn 
     ) 
end 

回答

0

問題不在於if語句。可悲的是,我的邏輯是將值發送到存儲過程。

1

也許是一個併發問題?如果是這樣,嘗試創建一個事務並使用UPDLOCK提示選擇數據。

1

添加UPDLOCKHOLDLOCK提示,以你的SELECT語句和使用事務

3

兩個念頭。

首先,如果涉及NULL,您的「where exists」邏輯可能無法正常工作。其次,我會嘗試使它成爲一個聲明(因爲關係數據庫的ACID屬性),而不是混淆事務,鎖和他們的好朋友阻塞和死鎖。以下聲明有效:

INSERT tableName (myId, otherColumn) 
select @myId, @otherColumn 
except select myId, otherColumn 
    from tableName 

根據表大小和/或索引問題,這可能不適用於您;其他變體也是可能的,這取決於你的情況。

0

我認爲它有一個獨特的關鍵,超過myID和其他列。

如果是這樣,它有多大可能被競爭條件所打破。可能你只需要執行插入操作,並且更好地處理任何異常或可能性,只是允許將異常提交給調用者(畢竟它可能想通知用戶這種情況)。

相關問題