根据主题,当我根据以下内容将某些记录插入mcard_list
时,触发器插入操作无法正常工作,
SQL Server触发器功能:
create trigger cmpnupdatemcard on MP.dbo.mcard_list
For Insert
AS
declare @est_no varchar(100);
select @est_no = ins.est_no from inserted ins;
if NOt exists ( select * from mcard where est_no = @est_no )
Begin
insert into mcard select * from mcard_list where est_no = @est_no
delete from mcard_list where est_no=@est_no
End
Else
Begin
delete from mcard where est_no = @est_no
insert into mcard select * from mcard_list where est_no = @est_no
delete from mcard_list where est_no=@est_no
End
Go
Iocmd.execute("insert into mcard_list select '" + m.sample1 + "',sample2 from Table1) -not work.
Iocmd.execute("insert into mcard_list select '" + m.sample1 + "','" + sample2 + "') - work.
我发现如果我将变量(“sample2”)从另一个查询执行中分离出来并再次添加回上面的行而不是从前面的语句,它将正常工作。
如果我想再次加入“来自”声明,感谢有人可以帮我解决这些问题。感谢。
答案 0 :(得分:5)
每个语句执行一次插入触发器,而不是每个插入行执行一次。您必须重写触发器,以便处理伪表inserted
具有多行的情况。
答案 1 :(得分:1)
您的根本缺陷是,您似乎希望触发器每行一次 - 这在SQL Server中是 NOT 。相反,触发器会在每个语句时触发,而伪表Inserted
可能包含多行。
鉴于该表可能包含多行 - 您希望在这里选择哪一行?
select @est_no = ins.est_no from inserted ins;
未定义 - 您可以从Inserted
中的一个任意行获取值 - 并忽略所有其他行。
您需要使用Deleted
WILL 包含多行的知识重写整个触发器。您需要使用基于集合的操作 - 不要只期望Inserted
中的一行!