2013-09-25 2 views
4

Я использую SqlBulkCopy класс для вставки 50k строк в то время в таблице tbl_records Я поставил After Insert триггер на эту таблицу и используя следующий кодОгонь триггером для каждой вставленной строки, используя 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 вставляется из 50 000

Я хочу, чтобы он стрелял для каждого ряда. Как я могу это сделать??

+0

Я уже проверил, что ответ, но в моем случае после добавления 'SqlBulkCopyOptions' еще стреляет триггер только для первой строки, вставленной из 50k строк –

+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, содержащей много строк. В любом случае, это лучшая практика и необходимая практика.

он стреляет триггер только для первой строки, вставленной из 50k строк

Вы должны искажая ситуацию, может быть, потому, что вы не знали, что триггеры могут содержать несколько строк в виртуальных таблицах.

4

Размер пакета объекта SqlBulkCopy - это полный набор строк по умолчанию.

Вот что говорит MSDN о значениях свойства BatchSize: «Zero (по умолчанию) указывает, что каждая операция WriteToServer представляет собой одну партию».

В этом случае триггер срабатывает один раз, но таблица Inserted будет содержать записи для всех затронутых записей.

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

Смежные вопросы