2014-12-15 6 views
2

ОБНОВЛЕНИЕ: закончен с использованием этого метода, созданного Джонни Бубриски, а затем немного изменил его, чтобы пропустить дубликаты. Работает как шарм и, по-видимому, довольно быстро. Ссылка: http://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/Массовая вставка из CSV-файла - пропустить дубликаты

Я искал ответ на этот вопрос, но не могу найти его. Я делаю массивную вставку T-SQL для загрузки данных в таблицу в локальной базе данных из файла csv. Мое заявление выглядит следующим образом:

BULK INSERT Orders 
FROM 'csvfile.csv' 
WITH(FIELDTERMINATOR = ';', ROWTERMINATOR = '0x0a', FORMATFILE = 'formatfile.fmt', ERRORFILE = 'C:\\ProgramData\\Tools_TextileMagazine\\AdditionalFiles\\BulkInsertErrors.txt') 
GO 

SELECT * 
FROM Orders 
GO 

я получаю исключение при попытке вставить повторяющиеся строки (например, принимая тот же файл CSV дважды), который вызывает всю вставку, чтобы остановить и откат. Достаточно понятно, поскольку я нарушаю ограничение первичного ключа. Сейчас я просто показываю сообщение, чтобы пользователи знали, что дубликаты присутствуют в файле csv, но это, конечно, не правильное решение, на самом деле это не решение. Мой вопрос в том, есть ли способ игнорировать эти повторяющиеся строки и просто пропустить их и добавлять только строки, которые не дублируются? Может быть, в попытке поймать?

Если это невозможно, какой был бы «правильный» (из-за отсутствия лучшего слова) способ импорта данных из файла csv? Исключение вызывает у меня немного проблем. Я где-то читал, что вы можете настроить временную таблицу, загружать в нее данные и выбирать между двумя таблицами перед вставкой. Но действительно ли нет более простого способа сделать это с объемной вставкой?

+1

Импортируйте данные во временную таблицу, очистите их, а затем вставьте их в пункт назначения. В противном случае используйте SSIS для очистки в рамках потока импорта. –

ответ

1

Вы можете установить свойство MAXERRORS на достаточно высокое значение, которое позволит вставить действительные записи, а дубликаты - игнорировать. К сожалению, это будет означать, что любые другие ошибки в наборе данных не приведут к сбою нагрузки.

В качестве альтернативы вы можете установить свойство BATCHSIZE, которое будет загружать данные в несколько транзакций, поэтому, если есть дубликаты, оно будет откатывать только пакет.

Более безопасный, но менее эффективный способ заключается в загрузке CSV-файла в отдельную, пустую таблицу и последующем объединении их в таблицу заказов, как вы упомянули. Лично я так делаю.

Ни одно из этих решений не является идеальным, но я не могу придумать способ игнорировать дубликаты в синтаксисе объемной вставки.

+0

Да, мне не очень нравится идея несогласованности, которая может быть потенциально вызвана вашими двумя первыми предложениями. Наверное, я попытаюсь пойти с манекеном. – St0ffer

+0

Я положу твой ответ, потому что это было технически правильно, хотя в конце я отступил от использования объемной вставки. – St0ffer

Смежные вопросы