2010-07-19 95 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