Я пытаюсь вставить огромное количество данных в SQL-сервер. Моя таблица назначения имеет уникальный индекс под названием «Хэш».
Я хотел бы заменить реализацию SqlDataAdapter на SqlBulkCopy. В SqlDataAapter есть свойство, называемое ContinueUpdateOnError, когда установлено значение true adapter.Update (table) вставляет все возможные строки и помещает строки ошибок в свойство RowError.
Вопрос в том, как я могу использовать SqlBulkCopy для вставки данных как можно быстрее, отслеживая, какие строки были вставлены и какие строки не были (из-за уникального индекса)?
Вот дополнительная информация:
Процесс повторяется, часто задается по расписанию, чтобы повторить.
Исходные и целевые таблицы могут быть огромными, а иногда и миллионами строк.
Несмотря на то, что сначала можно проверить значения хэша, для этого требуется две транзакции для каждой строки (сначала для выбора хэша из таблицы назначения, а затем выполнить вставку). Я думаю, что в случае adapter.update (table) быстрее проверять RowError, чем проверять хеш-хиты на строку.
SqlBulkCopy имеет очень ограниченные средства обработки ошибок, по умолчанию он даже не проверяет ограничения.
Тем не менее, его быстро, действительно очень быстро.
Если вы хотите обойти проблему дублирования ключа и определить, какие строки дублируются в пакете. Один из вариантов:
Этот процесс будет эффективно работать, если вы вставляете огромные наборы, а размер исходных данных в таблице не слишком велик.
Не могли бы вы расширить свой вопрос, включив в него весь контекст проблемы.
РЕДАКТИРОВАТЬ
Теперь, когда у меня есть еще какой-то контекст, вы можете пойти по этому пути:
Этот процесс очень близок к поездкам в оба конца, и учитывая, что ваши спецификации должны быть очень быстрыми;
Совсем иной подход, чем предлагалось; Выполните SqlBulkCopy
и поймайте полученное SqlException :
Violation of PRIMARY KEY constraint 'PK_MyPK'. Cannot insert duplicate
key in object 'dbo.MyTable'. **The duplicate key value is (17)**.
Затем вы можете удалить все элементы из вашего источника из ID 17, первой записи, которая была дублирована. Я делаю предположения здесь, которые относятся к моим обстоятельствам и, возможно, не к вашим; то есть , что дублирование вызвано теми же самыми данными из ранее не удалось SqlBulkCopy
из - за ошибок SQL / сети во время загрузки.