Если вы делаете это регулярно, то для этого тома я бы использовал SqlBulkCopy
, чтобы передать данные в промежуточную таблицу (та же схема, что и в целевой таблице, но изолированная), а затем использовать хранимую процедуру, чтобы выполнить вставки / обновления (из промежуточной таблицы в фактическую таблицу) - возможно, заключены в транзакцию.
Это позволит свести к минимуму циклические повторы и использовать API массовой вставки для передачи данных.
Если вам не нужно все в одном пакете, другим вариантом будет обработка данных в блоках, скажем, по 100 записей; это должно работать, не заставляя транзакции занимать слишком долго - это будет заметно медленнее, чем подход массового копирования, но имеет преимущество в том, что оно основано на объектах и не требует от вас использования дополнительного набора инструментов / языков.