Вопрос

Я пытаюсь выполнить массовую загрузку в базу данных 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. Вы можете сказать это, чтобы пропустить дубликаты. Но сначала убедитесь, что они являются истинными дубликатами. Что если данные в некоторых столбцах отличаются, как узнать, какую запись лучше хранить?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top