我已经编写了下面的触发器,以防止在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
答案 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的行?