【问题标题】:Insert Trigger does not work on bulk insert; trigger is working with cursor插入触发器不适用于批量插入;触发器正在使用光标
【发布时间】:2010-07-19 08:37:44
【问题描述】:

在批量插入时,插入触发器仅适用于第一条记录,不适用于所有其他记录,但在使用游标插入记录时触发器正常工作。

插入触发器更新目标表的几列。要插入批量数据,我使用以下脚本

INSERT INTO DestinationTable (Column1, Column2)
SELECT * FROM SourceTable

我在插入记录的触发器中得到了几列,如以下脚本,并处理它们以更新 DestinationTable 的列

SELECT @col1 = Column1, @col2 = Column2, FROM INSERTED
  1. 为什么在批量插入时,触发器没有 工作?
  2. 是我遗漏了什么还是必须 使用光标?

我使用的是 SQLServer 2005

编辑

触发代码

http://stashbox.org/957108/InsertTrigger.sql

谢谢。

【问题讨论】:

  • 文档怎么说? IIRC,他们说出你的经历。

标签: sql-server-2005 tsql


【解决方案1】:

从您发布的代码看来,批量插入只是意味着插入多行。不是这个BULK INSERT

INSERTED 伪表包含语句插入的所有行。它不是行级触发器。您需要使用游标进行 RBAR 处理,或者理想情况下,将其作为一个集合进行处理。例如,如果您要更新另一个表,则可以加入 inserted 表并更新一条语句中的所有行。

【讨论】:

  • 谢谢马丁,你能详细说明一下吗?将其作为一个集合处理?
  • SourceTable 有 10K 行,我想一次性将所有行插入到 DestinationTable 中,还希望插入触发器更新每一行。
  • 我已经上传了触发脚本。请查看我有问题的编辑。如果您在经历它时也提到其他错误,那就太好了。
  • 对我来说一切都很好。比我预期的要长一点!基本上,为了让您的触发器针对多行工作,您可以只使用一个游标并以您当前正在执行的方式处理每一行,或者您需要替换它当前正在为每行填充一个标量变量的部分,以便它可以工作对于多行。也许您可以从使用表变量而不是标量变量开始,然后尝试结合一些步骤。
  • 谢谢马丁。很大的帮助。真的很感激。
【解决方案2】:

在光标上,这是因为每条记录一次插入一个,而不是批量插入。因此,通过批量插入,它们可以批量插入。所以触发器会为批处理触发一次。

我想我曾经读过一种非常干净的解决方法。让我看看能不能找到。

编辑:您知道当您说批量操作时,我什至没有注意 sql,并假设您使用的是 bcp。但我仍然记得我要寻找的解决方法。

EDIT2:好的,看看这篇文章,看看它是否对你有帮助: http://weblogs.sqlteam.com/tarad/archive/2004/09/14/2077.aspx

【讨论】:

  • 谢谢@spinon,如果你能找到它,那将是很大的帮助。
【解决方案3】:

谁说触发器不能与 bulkinsert 或 bulkcopy 一起使用是我制作的,而且效果很好

【讨论】:

  • 如果有人想知道我们到底要如何编码,可以问我。
猜你喜欢
  • 2016-10-13
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多