2013-09-25 17 views
4

每一個插入的行我使用SqlBulkCopy類在表中的時間tbl_records 我設置了After Insert觸發器在這個表中插入50,000列,並使用下面的代碼消防觸發使用SqlBulkCopy的

SqlBulkCopy SqlBc1 = new SqlBulkCopy(strConnString, SqlBulkCopyOptions.FireTriggers); 

// Set DataReader For SqlBulkCopy 

sqlComm = new SqlCommand(strQuery, sqlTemCon); 
sqlComm.CommandTimeout = 3600000; 
sqlComm.CommandType = System.Data.CommandType.Text; 
SqlDataReader dReader = sqlComm.ExecuteReader();  
SqlBc1.WriteToServer(dReader); 

但執行後的前衛。它觸發器只有First排50k插入

我想它應該爲每一行開火。我怎樣才能做到這一點??

+0

我已經檢查這個問題的答案,但在我的情況下加'SqlBulkCopyOptions'仍然是射擊觸發插入出50,000列 –

+0

HTTP只有第一行後://stackoverflow.com/questions/5805413/how-can-i-get-a-trigger-to-fire-on-each-inserted-row-during-an-insert-into-table – Karthik

回答

7

觸發器從不觸發每行。它們觸發相應DML語句的所有行。重寫你的觸發器,以便它可以處理包含許多行的INSERTED表。無論如何,這是最佳實踐和必要的練習。

它發射扳機的插入出50,000列

您必須誤解的情況,也許是因爲你沒有察覺到觸發器可以包含虛擬表中多行僅第一行。

4

默認情況下,SqlBulkCopy對象的批量大小是完整的一組行。

以下是MSDN有關BatchSize屬性值的說明: 「零(默認值)表示每個WriteToServer操作都是單個批處理。」

在這種情況下,觸發器將觸發一次,但插入的表格將包含所有受影響記錄的條目。

0

我試過這個,它會工作。

我希望它的幫助你..

CREATE TRIGGER Triggername ON TableName After INSERT AS SET NOCOUNT ON;

insert into TargetTable (Fields) SELECT (i.field1,i.field2,i.field3,....,i.fieldn) FROM inserted i GO