插入多行SQL时触发不对所有行触发

时间:2014-10-31 10:54:00

标签: sql-server sql-server-2008 sql-server-2012

我遇到触发器问题。

我为像这样的表

创建了一个触发器
 ALTER TRIGGER [dbo].[manageAttributes] 
ON [dbo].[tr_levels]
AFTER insert
AS 
BEGIN

set nocount on
declare @levelid int

select @levelid=levelid  from inserted
insert into testtable(testid) values(@levelid)
-- Insert statements for trigger here

END

但是当我将行插入到表tr_levels中时,就像这样

insert int tr_levels (column1,colum2) values(1,2)

触发完全触发

但是当我尝试像这样插入表格

insert int tr_levels (column1,colum2) values(1,2),(3,4),(5,6)..

触发器不会触发所有行。它第一行只发射一次。是SQL的错误还是有解决方案来触发批量插入查询中所有行插入的触发器

2 个答案:

答案 0 :(得分:3)

不,它会触发所有行 - 一次 - 但你忽略了其他行,就好像inserted只包含一行一样。 select @scalar_variable=column from inserted将从其中一行中任意检索一个值而忽略其他行。在inserted子句

中使用FROM编写基于集合的插入

您需要将inserted视为可包含0,1或多个行的表。所以,像:

ALTER TRIGGER [dbo].[manageAttributes] 
ON [dbo].[tr_levels]
AFTER insert
AS 
BEGIN

set nocount on
insert into testtable(testid)
select levelid from inserted

END

答案 1 :(得分:0)

你有同样的问题很多人都有这个问题:你认为触发器是每行触发的。它不是 - 它是每次操作。并且插入是一个表。你取一个(随机)值而忽略其余的值。修复它,它会工作。

装配工在基表中的每个语句中触发一次。因此,如果在一个语句中插入5行,则触发器触发一次,插入的行为5行。