2013-05-29 33 views
0
AFTER INSERT 
AS 
BEGIN 
DECLARE 
@p_newColorCode int 

SET NOCOUNT ON; 
SELECT @p_newColorCode = i.COLOR_CODE, 
@p_newStateCode = i.STATE, 
FROM inserted I 

BEGIN TRANSACTION 

IF @p_newColorCode IS NOT NULL 
BEGIN 
    INSERT INTO CALL_HISTORY(CALL_HISTORY_REC_NO,CHANGE_PERSON,CHANGE_DATE,CHANGE_TYPE,CHANGE) 
    VALUES(@p_call_hist_rec_no,22,GETDATE(),@p_newPlateNo +': ADDED COLOR', dbo.fn_GetCodeDesc(@p_newColorCode)) 
END 

由於某些原因,當@p_newColorCode爲NULL時,它仍然進入IF。我還需要做些什麼才能做到這一點?如何檢查sql觸發器中的變量是否爲空SQL Server 2008

感謝您的幫助提前。

SQL Server 2008 stnd。

回答

1

你的觸發器不好。您不應該爲插入的表中的字段設置標量變量,因爲該表中可能有多個記錄。 SQL服務器一次觸發一組數據而不是一條記錄。該觸發器將只處理一條記錄,因此需要使用連接進行完全重寫。即使你認爲只有一個記錄會被輸入,也會有人需要做一個批量插入的時間。 IT人員不負責任的觸發器只處理一個記錄插入,並最終導致數據完整性問題。

但是,使用插入表中的選擇而不是插入中的值從句,可以通過使用where子句僅包含字段不爲空的記錄來解決問題。

+0

謝謝你的建議,是的,通常我不會這樣做,但在這種情況下,程序不能一次插入或更新一個以上的記錄,所以沒關係,但我同意你通常不會做這件事很好。就性能而言,不會有必要爲每個字段做一個選擇。因爲爲了簡單起見,我只提一個,但可能有40個字段需要檢查。再次感謝您的建議。 –

+0

數據庫被應用程序以外的機制插入。你永遠不能認爲只有一條記錄會被插入。 – HLGEM

0

好吧,在我的情況下,我應該在發佈這個問題之前使用探查器,這是你如何檢查變量爲null,但在我的情況下,有一個從程序提供的0代替null。感謝您的幫助和建議。

相關問題