Я вставляю много данных с помощью SqlBulkCopy. Источник данных может иметь несколько дублированных строк. В таблице назначения у меня есть индекс уникальности.
Когда появляется первая дублируемая строка, SqlBulkCopy выдает исключение и откатывает внутреннюю транзакцию. Я хочу, чтобы он игнорировал исключение и продолжал вставлять. (ТОЛЬКО, если исключение для дублированной строки).
Есть несколько вопросов по этой проблеме, но все они ищут дубликаты строк, я просто их не забочу.
Это один из компромиссов с SqlBulkCopy - я использую это, когда знаю, что у меня чистые данные. Если вам нужно хорошо разбираться в ошибках в таких ситуациях, когда у вас нет чистых данных, тогда другие подходы «лучше» (это компромисс, хотя для производительности).
Следуя вашему другому вопросу, подход SqlDataAdapter предоставит вам эту возможность, поскольку есть свойство ContinueOnError, которое вы можете установить, что позволит процессу продолжить в случае таких ошибок - очень удобно. Я использую этот подход, когда мне нужно обрабатывать не-чистые / потенциально проблематичные данные из .NET. Но, как я уже говорил ранее, вы увидите стоимость перф.
Если вы хотите абсолютную производительность и отвечаете вашим первоначальным требованиям сохранения отдельно, то вы должны дедуктировать данные перед загрузкой в БД. Или используйте такой подход, как TomTom.
Исправьте проблему, прежде чем делать объемную вставку. Массовая вставка специально определена, чтобы не обрабатывать такие вещи. Для этого он помещает SQL Server в некоторый режим массовой вставки, который быстрее ... но имеет ограничения. Все ключевые нарушения должны выполняться перед вставкой.
То, что вы хотите сделать, - это вставить в промежуточную таблицу (разрешено удвоение), затем MERGE в основную таблицу (используя команду MERGE).