SQL插入触发器以捕获多行的NULL值

时间:2014-07-16 11:55:15

标签: sql-server triggers

我已经编写了下面的触发器,以防止在pch_x字段中输入NULL。如果我插入1行,它工作正常,但如果我一次输入多个行,则无效。有人可以帮我一点吗?这是我的代码

create trigger test 
ON [dbo].TEMP
for INSERT
AS
BEGIN 
declare @xcheck varchar(50)
set @xcheck= (select i.pch_x FROM temp L INNER JOIN INSERTED I
ON L.id = I.id)
F (@xcheck is NULL ) 
         begin 
         RAISERROR('NULL in pch_x', 16, 1) 
         ROLLBACK
         end 
END

2 个答案:

答案 0 :(得分:1)

我不确定你为什么要在触发器中执行此操作,但基于集合的测试方法是使用EXISTS

create trigger test 
ON [dbo].TEMP
for INSERT
AS
BEGIN 
IF EXISTS(select * FROM temp L INNER JOIN
                        INSERTED I
                            ON L.id = I.id
          where i.pch_x IS NULL) 
         begin 
         RAISERROR('NULL in pch_x', 16, 1) 
         ROLLBACK
         end 
END

我也不确定你为什么要回到桌子上 - 我认为检查可以在不参考temp的情况下运行:

create trigger test 
ON [dbo].TEMP
for INSERT
AS
BEGIN 
IF EXISTS(select * FROM INSERTED
          where pch_x IS NULL) 
         begin 
         RAISERROR('NULL in pch_x', 16, 1) 
         ROLLBACK
         end 
END

对于你不寻常的要求,在包含一些带空值的行的行集中,你希望那些没有空值的行成功,而那些带空值的行失败,最明智的是INSTEAD OF触发器:

create trigger test 
ON [dbo].TEMP
INSTEAD OF INSERT
AS
BEGIN
declare @rc int
INSERT INTO dbo.temp (/* column list */)
SELECT /* column list */ from inserted where pch_x IS NOT NULL
set @rc = @@ROWCOUNT

IF @rc <> (select COUNT(*) from inserted)
         begin 
         RAISERROR('NULL in pch_x', 16, 1) 
         --ROLLBACK
         end 
END

答案 1 :(得分:0)

Juergen d, 如果您将使用INSTEAD OF触发器,而不是插入行,您将插入没有NULL的行?