触发器插入不能与insert语句中的insert.select一起使用

时间:2014-03-24 04:26:07

标签: sql-server sql-server-2008 tsql visual-foxpro triggers

根据主题,当我根据以下内容将某些记录插入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”)从另一个查询执行中分离出来并再次添加回上面的行而不是从前面的语句,它将正常工作。

如果我想再次加入“来自”声明,感谢有人可以帮我解决这些问题。感谢。

2 个答案:

答案 0 :(得分:5)

每个语句执行一次插入触发器,而不是每个插入行执行一次。您必须重写触发器,以便处理伪表inserted具有多行的情况。

Common SQL Server Mistakes - Multi Row DML Triggers

答案 1 :(得分:1)

您的根本缺陷是,您似乎希望触发器每行一次 - 这在SQL Server中是 NOT 。相反,触发器会在每个语句时触发,而伪表Inserted可能包含多行

鉴于该表可能包含多行 - 您希望在这里选择哪一行?

select @est_no = ins.est_no from inserted ins;

未定义 - 您可以从Inserted中的一个任意行获取值 - 并忽略所有其他行。

您需要使用Deleted WILL 包含多行的知识重写整个触发器。您需要使用基于集合的操作 - 不要只期望Inserted中的一行!