Sql server 捕捉多行空值的SQL插入触发器

Sql server 捕捉多行空值的SQL插入触发器,sql-server,triggers,Sql Server,Triggers,我在下面编写了一个触发器,用于防止在pch_x字段中输入NULL。如果我插入一行就可以了,但是如果我一次输入多行就不行了。谁能帮我一点忙吗?这是我的密码 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

我在下面编写了一个触发器,用于防止在pch_x字段中输入NULL。如果我插入一行就可以了,但是如果我一次输入多行就不行了。谁能帮我一点忙吗?这是我的密码

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

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

我也不知道你为什么要回到桌子上——我原以为检查可以在不参考温度的情况下运行:

对于一个不寻常的要求,即在包含一些具有null的行的行集中,希望那些没有null的行成功,而那些具有null的行失败,最明智的做法是使用INSTEAD OF触发器:


为什么列没有声明为NOT NULL?我知道NOT NULL会简单得多,但我的经理希望这样做。嗨,我尝试了EXISTS,但当我插入以下行时,没有一行被插入,因为第二行有NULL。理想情况下,我希望触发器允许NOT nulli.e。要插入的第一行,忽略第二行的null。插入TEMP ref,pch_x,id值'Test TRIGGER','666',31,null,32removed join to TEMP,但获取错误,在pch_x Msg 3609,Level 16,State 1,Line 1中显示uu 50000,Level 16,State 1,Procedure Test,Line 9 null。事务在触发器中结束。批处理已中止。并且表中没有输入行。这是一个非常不寻常的要求-我们通常希望语句完全成功或完全失败,报告错误但仍更改数据库也是不寻常的。您的上一个代码完全按照他的要求执行。非常感谢。我猜他的观点是,我们将确切地知道空值在哪里,并在稍后阶段进行排序。老实说,我不太清楚他为什么想要这个。
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
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
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