Чтобы минимизировать продолжительность транзакции, я всегда делаю это путем массового копирования в таблицу staging (та же схема, но с другим именем - без индексов и т. Д.), А затем, когда все данные находятся в сервер, сделайте что-то вроде:
BEGIN TRAN
DELETE FROM FOO
INSERT FOO ...
SELECT ...
FROM FOO_STAGING
COMMIT TRAN
DELETE FROM FOO_STAGING
(транзакция может быть либо в TSQL, либо в соединении через управляемый код или через TransactionScope
; TSQL может быть либо в виде текстовой команды, либо в виде SPROC)