Как предотвратить дублирование записей в SqlBulkCopy, когда нет первичного ключа
================================================================================

 Я получаю ежедневный XML-файл, содержащий тысячи записей, каждый из которых является бизнес-транзакцией, которую мне нужно хранить во внутренней базе данных для использования в отчетности и биллинге. У меня создалось впечатление, что каждый день содержит только уникальные записи, но обнаружил, что мое определение уникальности не совсем то же самое, что и у провайдера. 

 Текущее приложение, которое импортирует эти данные, является консольным приложением C # .Net 3.5, оно делает это с использованием SqlBulkCopy в таблице базы данных MS SQL Server 2008, где столбцы точно соответствуют структуре записей XML. Каждая запись имеет только более 100 полей, и в данных нет естественного ключа, или, скорее, поля, которые я могу придумать, как составной ключ, также должны иметь нулевые значения. В настоящее время таблица имеет несколько индексов, но не первичный ключ. 

 В принципе, вся строка должна быть уникальной. Если одно поле отличается, оно достаточно допустимо для вставки. Я посмотрел на создание хэша MD5 всей строки, вставив его в базу данных и используя ограничение, чтобы предотвратить включение SqlBulkCopy строки, но я не вижу, как получить MD5 Hash в операции BulkCopy, и я не если вся операция завершится с ошибкой и откат, если какая-либо одна запись не удалась, или если она будет продолжена. 

 Файл содержит очень большое количество записей, идущих по строке в XML, запрос базы данных для записи, соответствующей всем полям, а затем принятие решения о вставке - это единственный способ увидеть, как это можно сделать. Я просто надеялся не переписывать приложение полностью, и операция массового копирования происходит намного быстрее. 

 Кто-нибудь знает способ использования SqlBulkCopy, предотвращая дублирование строк без первичного ключа? Или любое предложение по-другому сделать это? 

 Я бы загрузил данные в промежуточную таблицу, а затем обработал дубликаты после копирования в финальную таблицу. 

 Например, вы можете создать (не уникальный) индекс в промежуточной таблице для обработки «ключа»,