使用SqlBulkCopy为每个插入的行触发触发器

我正在使用SqlBulkCopy类在表tbl_records一次插入50k行我在此表上设置了After Insert触发器并使用以下代码

 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); 

但执行前后。 它仅触发50k插入的First行触发器

我想它应该为每一行开火。 我怎样才能做到这一点??

触发器永远不会每行触发。 它们为相应的DML语句的所有行触发。 重写您的触发器,以便它可以处理包含许多行的INSERTED表。 无论如何,这是最佳实践和必要的练习。

它只触发了从50k行插入的第一行的触发器

您必须误解情况,可能是因为您不知道触发器可以在虚拟表中包含多个行。

默认情况下,SqlBulkCopy对象的批处理大小是完整的行集。

以下是MSDN对BatchSize属性值的说法:“零(默认值)表示每个WriteToServer操作都是一个批处理。”

在这种情况下,触发器将触发一次,但Inserted表将包含所有受影响记录的条目。

我试过这个,它会起作用。

我希望它对你有所帮助..

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

插入到TargetTable(字段)SELECT(i.field1,i.field2,i.field3,….,i.fieldn)FROM inserted i GO