2013-04-08 95 views
-2

我正在創建一個存儲過程,如果尚未插入記錄,則需要執行插入操作。如果存儲過程中不存在記錄,則插入

此存儲過程可以由用戶多次運行。我正在使用SQL Server 2008

我的查詢如下。它不會給出任何錯誤,但也不會做任何事情。如果我刪除了If不存在,並且只用一個簡單的插入操作,它將首次運行,然後在記錄已經存在時給出一個錯誤。

CREATE PROCEDURE LoadRecords 
    @ADD_BY varchar(10) 
    ,@YEAR varchar(4) 
    ,@Inserted int OUTPUT 

AS 
BEGIN 

DECLARE @OFF char(2) 
DECLARE @Year char(4) 
DECLARE @ID varchar(9) 

set @Inserted =0 

/*check if record exists or not */ 

IF NOT EXISTS(

Select F.OFF, (@YEAR), F.ID, F.Form, @ADD_BY 

from Table1 as F 

Left Join Table2 R 
ON F.ID = R.ID 
and F.OFF = R.OFF 
and F.Year = R.Year 

where F.Year = (@Year -1) 

and @OFF= F.OFF 
and @Year = F.Year 
and @ID= F.ID 
and @Form = F.Form 
) 
/*insert values if records do not exist */ 

INSERT INTO Table1 (
    OFF, YEAR, ID, Form ,ADD_BY) 
Values(@OFF, @Year, @ID , @Form, @ADD_BY) 


SET @Inserted [email protected]@ROWCOUNT 

END 
GO 
+3

** OK **。你已經是SO成員2年了,並且提出了105個問題,而**從來沒有**真正困擾過你自己的格式。你需要學習如何使用編輯器,並停止依靠其他人來解決你的問題。 – meagar 2013-04-08 16:06:07

+0

爲什麼不在沒有檢查的情況下執行'INSERT',如果失敗則是'CATCH'主鍵衝突?如果您希望大多數插入操作能夠成功,那麼這會更容易一些,並且避免了代碼中的併發問題,即另一個會話可能會在您的會話「SELECT」之後但在「INSERT」之前「插入」相同的值。 – Pondlife 2013-04-08 16:49:49

回答

2

我認爲你必須與你的IF NOT EXISTS添加的條件的問題,特別是這些條件是相反的:

where F.Year = (@Year -1) 
and @Year = F.Year 

,將永遠是假的。

相關問題