SQL Импорт пропускает дубликаты
-
07-07-2019 - |
Вопрос
Я пытаюсь выполнить массовую загрузку в базу данных SQL-сервера. В исходном файле есть дубликаты, которые я хочу удалить, поэтому я надеялся, что операция автоматически загрузит первый, а затем отбросит остальные. (Я установил ограничение уникального ключа). Проблема в том, что в момент попытки повторной загрузки происходит сбой и происходит откат. Могу ли я просто сказать, чтобы SQL продолжал работать?
Решение
Попробуйте выполнить массовую вставку данных во временную таблицу, а затем ВЫБЕРИТЕ DISTINCT, как предложено @madcolor, или
INSERT INTO yourTable
SELECT * FROM #tempTable tt
WHERE NOT EXISTS (SELECT 1 FROM youTable yt WHERE yt.id = tt.id)
или другое поле в предложении WHERE.
Другие советы
Если вы делаете это с помощью какого-либо инструмента SQL, такого как SQL Plus, DBVis или Toad, то я подозреваю, что нет. Если вы делаете это программно на языке, то вам нужно разделить и победить. Предположительно, выполнение построчного обновления и перехват каждого исключения будет слишком длительным процессом, поэтому вместо этого вы можете сначала выполнить пакетную операцию для всего блока SQL, а в случае неудачи - в первой половине, а в случае неудачи - сделайте это в первой половине первой половины. Повторяйте этот путь до тех пор, пока у вас не получится блок. Откажитесь от блока и выполните ту же процедуру с остальной частью SQL. Все, что нарушает ограничение, в конечном итоге окажется единственным оператором SQL, который вы знаете, чтобы регистрировать и отбрасывать. Это должно импортировать с максимально возможной массовой обработкой, в то же время выбрасывая недопустимые строки.
Используйте для этого SSIS. Вы можете сказать это, чтобы пропустить дубликаты. Но сначала убедитесь, что они являются истинными дубликатами. Что если данные в некоторых столбцах отличаются, как узнать, какую запись лучше хранить?