【发布时间】:2018-11-10 01:50:06
【问题描述】:
我正在使用 sql 批量复制将数据从 Table1 复制到 Table2 表。我已在 Table2 上应用了触发器,但我的触发器并未在每一行上触发。这是我的触发器和 sqlbulkcopy 函数。
SqlConnection dstConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Destination"].ConnectionString);
string destination = dstConn.ConnectionString;
//Get data from Source in our case T1
DataTable dataTable = new Utility().GetTableData("Select * From [db_sfp_ems].[dbo].[tbl_current_data_new] where [start_date]>'" + calculate_daily_Time + "' and status=0" , source);
SqlBulkCopy bulkCopy = new SqlBulkCopy(source, SqlBulkCopyOptions.FireTriggers)
{
//Add table name of source
DestinationTableName = "tbl_current_data",
BatchSize = 100000,
BulkCopyTimeout = 360
};
bulkCopy.WriteToServer(dataTable);
//MessageBox.Show("Data Transfer Succesfull.");
dstConn.Close();
-----触发器-----
ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[tbl_current_data]
AFTER INSERT
AS
BEGIN
declare @intime datetime
declare @sdp_id numeric
declare @value numeric(9,2)
SELECT @intime= DATEADD(SECOND, -DATEPART(SECOND, start_date), start_date) FROM INSERTED
SELECT @sdp_id= sdp_id FROM INSERTED
SELECT @value= value FROM INSERTED
INSERT INTO Table3(sdp_id,value,start_date)
VALUES
(
@sdp_id,@value,@intime
)
【问题讨论】:
-
我原以为批量复制的重点是尽可能快地完成,而不是触发触发器!
-
不太确定,但由于大容量复制不会在每一行之后提交,因此您的触发器不会在每一行之后被激活。但就在批量复制提交更改时。
-
触发器不适用于批量操作,但适用于原子操作。如果你想让触发器工作,你应该逐行处理插入
-
当我将 BatchSize = 100000 减少到 20 时,我的触发器就会被触发。但我不想要批量大小 20,我想要最小批量大小 100。
标签: sql .net sql-server database-connection