2013-05-29 32 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。感谢您的帮助和建议。

相关问题