2014-10-31 238 views
0

我面临触发问题。插入多行时,触发器不会触发所有行SQL

我创建了一个触发器的表像这样

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 

但是当我插入几行这样

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

触发器表tr_levels完美触发

但是,当我试图插入以此形式批量存入表格

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

触发器不会触发所有行。它仅在第一行触发一次。是SQL的错误还是有一个解决方案触发大容量插入查询中的所有行插入触发器

+0

@Damien_The_Unbeliever请求一点支持。我不明白这一点。我的意思是如何调整触发器,使其适用于每一行 – 2014-10-31 11:18:54

+0

您一直在评论中说话,就好像您需要为插入的每一行执行操作一样。有什么你需要做的,你不能一次完成所有的记录在'插入'? – 2014-10-31 11:26:23

回答

2

不,它确实火所有行 - 一次 - 但你通过充当如果inserted只包含一个忽视了其他行。 select @scalar_variable=column from inserted将任意检索其中一行的值并忽略其他值。在FROM条款

你需要把inserted为可包含0,1或行的表编写使用inserted一个基于集合的插入。所以,像这样:

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

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

END 
+0

这就是它的老板..谢谢你..但只是一个澄清..因为这个问题,我们不能更新另一个表,每次插入,没有(不使用游标)。由于整体考虑了特殊的表格INSERTED,所以插入效果很好。但更新会造成一些麻烦,我想.. – 2014-10-31 11:43:08

+0

@sforsandeep - 你应该总是尝试写你所有的代码来考虑行集,而不是一次一行。通常,你可以做一个基于集合的'UPDATE'就好了(SQL Server允许'UPDATE ... FROM',它有一些问题,但通常可以正常工作) – 2014-10-31 12:56:17

0

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

装配工在基准表中的每个语句中启动一次。因此,如果您在一条语句中插入5行,触发器将触发一次并插入5行。

+0

所以我认为触发不是完美的,因为根据理论,它应该在每次插入后触发(不意味着大块或单个)。因此需要将批量插入查询拆分为不同的插入语句。 – 2014-10-31 11:17:16

+0

@sforsandeep根据WHICH理论?你是一个人吗?猜猜看 - 所记录的行为与SQL集方法一致,并且任何阅读文档的人都可以接受。没有你说的理论。 – TomTom 2014-10-31 11:18:51

+0

对不起朋友,我的意思是我理解的..请忽略它,因为我提到的理论.. – 2014-10-31 11:20:18