2010-07-19 99 views
1

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

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

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

我得到了插入的记录,如下面的脚本,并在其上工作的触发几列更新

SELECT @col1 = Column1, @col2 = Column2, FROM INSERTED 
  1. 为什么destinationTable会列批量插入,触发不 工作?
  2. 我错过了什么,或者我必须使用光标 ?

我使用SQLServer的2005

编辑

触发代码

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

感谢。

+0

这些文档是怎么说的? IIRC,他们说你的经历。 – leppie 2010-07-19 08:43:05

回答

1

从您发布的代码,它看起来像由批量插入你仅仅意味着将多行。不是这个BULK INSERT

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

+0

谢谢马丁,请您详细说明一下;把它作为一个集合来处理? – Kashif 2010-07-19 08:45:45

+0

SourceTable有10K行,我想要一次性在DestinationTable中插入所有内容,并且还希望Insert Trigger更新每一行。 – Kashif 2010-07-19 08:48:33

+0

你可以发布你的触发代码吗? – 2010-07-19 09:13:03

0

那么在游标上,这是因为每个记录一次插入一个而不是批量。所以对于批量插入,他们插入一批。因此触发器会在批处理中触发一次。

我想我读了一次很干净的解决方法。让我看看我能否找到它。

编辑:你知道当你说批量操作时,我甚至没有注意到SQL,并假设你使用bcp。但我仍然记得一个我将要寻找的工作。

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

+0

谢谢@spinon,如果你能找到它会有很大的帮助。 – Kashif 2010-07-19 08:43:57

+0

感谢链接spinon。 – Kashif 2010-07-19 10:19:49

0

谁说这个触发器没有与bulkinsert或bulkcopy一起工作我做到了,它的工作很完美

+0

如果有人想知道我们要如何编写代码,请问我。 – 2015-07-30 07:08:00