.NET BulkCopy仅在一次插入时触发触发

时间:2013-11-07 18:59:24

标签: c# .net sql-server triggers sqlbulkcopy

我在表格上的每个插页上执行触发器。我正在使用批量复制来对此表进行批量插入。我读过FireTriggers会在桌子上触发我的触发器,但它只进行一次,而不是每次插入。触发器从插入的项中获取一些数据,并将其插入另一个表中。我只看到在另一个表中插入了一行,而不是一行。我错过了一个选项吗?

var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers, transaction);

3 个答案:

答案 0 :(得分:6)

“对于每个插页”,还是每个“行”?听起来你期望看到每一行的触发火。

这是一个关于触发器的常见误解 - 它们每行触发一次。他们没有。他们每次改变都会开火。在触发器的主体内部有一个名为“inserted”的虚拟表,其中包含插入的所有新行。听起来非常像数据库中的触发器只读取该表中的一行,而不是整个行。遗憾的是,这是很多人在SQL Server数据库中实现触发器的常见设计缺陷。

答案 1 :(得分:0)

我已经为所有商品分配了批量组ID。我用以下内容完成了这个:

1. If item has bulk group id
2. If item is being inserted, not updated
3. Do a select into from a selection of items based on the bulk group id

触发

    IF(@BulkGroupInsertId IS NULL OR EXISTS (SELECT * FROM DELETED))
    BEGIN
        -- Do Single Insert
    END
    ELSE
    BEGIN

    -- Bulk Insert

        INSERT INTO TeamSubscription (DivisionTeamId, PhoneNumber, DateCreated)
        SELECT tc.TeamId, p.MobilePhone, GETDATE()
        FROM
            -- Commented Out
        WHERE 
            -- Commented Out
        GROUP BY
            -- Commented Out

    END 

答案 2 :(得分:-1)

在创建SQLBulkCopy对象时添加此SQLBulkCopyOptions.FireTriggers。