Я получаю ежедневный XML-файл, содержащий тысячи записей, каждая из которых представляет собой бизнес-транзакцию, которую мне нужно сохранить во внутренней базе данных для использования в отчетах и выставлении счетов. У меня создалось впечатление, что файл каждого дня содержит только уникальные записи, но я обнаружил, что мое определение уникальности не совсем то же, что и у поставщика.
Текущее приложение, которое импортирует эти данные, является консольным приложением C # .Net 3.5, оно делает это с помощью SqlBulkCopy в таблицу базы данных MS SQL Server 2008, где столбцы точно соответствуют структуре записей XML. Каждая запись имеет чуть более 100 полей, и в данных нет естественного ключа, или, скорее, поля, которые я могу придумать, имеют смысл, поскольку составной ключ в конечном итоге также должен разрешать нули. В настоящее время таблица имеет несколько индексов, но не имеет первичного ключа.
По сути, вся строка должна быть уникальной. Если одно поле отличается, его достаточно для вставки. Я рассмотрел создание хэша MD5 для всей строки, вставку его в базу данных и использование ограничения, чтобы SqlBulkCopy не вставлял строку, но я не вижу, как включить хеш MD5 в операцию BulkCopy, и я не убедитесь, что вся операция завершится ошибкой и откатится, если какая-то одна запись не удалась, или если она будет продолжена.
Файл содержит очень большое количество записей, переходя строка за строкой в XML, запрашивая в базе данных запись, которая соответствует всем полям, а затем решение вставить - это действительно единственный способ, которым я могу это сделать. Я просто надеялся, что мне не придется полностью переписывать приложение, а операция массового копирования выполняется намного быстрее.
Кто-нибудь знает, как использовать SqlBulkCopy, предотвращая дублирование строк без первичного ключа? Или есть предложения по другому способу сделать это?