Если другой человек столкнется с этой проблемой и ищет решение, я также опубликую здесь свои выводы.
ВАЖНО: usr уже дал ответ, но я немного его объясню.
Во-первых, это то, что Microsoft документация говорит о массовой вставке,
Если FIRE_TRIGGERS не указан, триггеры вставки не выполняются.
FIRE_TRIGGERS Указывает, что любые триггеры вставки, определенные в целевой таблице, выполняются во время операции массового импорта. Если триггеры определены для операций INSERT в целевой таблице, они запускаются для каждого завершенного пакета.
FIRE_TRIGGERS
- это аргумент, используемый с BULK INSERT
оператором T-SQL.
И если вы пытаетесь использовать массовую вставку с SqlBulkCopy
class (.Net Framework / Core), вам необходимо использовать SqlBulkCopyOptions
Enum (документы).
Вы можете использовать перечисление SqlBulkCopyOptions при создании экземпляра SqlBulkCopy, чтобы изменить поведение методов WriteToServer для этого экземпляра.
Вот образец,
var options = SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.KeepIdentity;
var bulkCopy = new SqlBulkCopy(connectionString, options);
OK. Теперь триггеры будут работать с массовой вставкой, но почему только для одной записи. Прочтите еще раз, что Microsoft сказала о FIRE_TRIGGER
аргументе.
Если триггеры определены для операций INSERT в целевой таблице, они запускаются для каждого завершенного пакета.
Это означает, что ваш триггер будет работать сразу для всей партии. Но ваш пакет содержит более одной строки. Следовательно, ваш алгоритм триггера (то, что вы должны сделать с одной записью) будет работать для одной записи, а не для всех записей.
Теперь вы знаете, почему это не работает для всех, поэтому решение состоит в том, чтобы улучшить ваш триггер для работы с несколькими строками. Это означает, что итерация бросает все строки с INSERTED
временной таблицей и выполняет ваш алгоритм для всех записей. Вы можете использовать CURSOR
или простой WHILE LOOP
. Тебе решать.
Вы можете найти примеры здесь.
person
Emalsha Rasad
schedule
19.02.2020
SqlBulkCopyOptions
он все еще запускает триггер только для первой строки, вставленной из 50 тыс. Строк - person Rajeev Kumar   schedule 25.09.2013