2015-06-25 2 views
1

Я импортирую CSV-файл на SQL-сервер. Проблема в том, что мне нужно обновить, если строки найдены, но я не нашел эквивалент INSERT UPDATE или что-то похожее на это.SQL Server Bulk Insert Update из CSV?

Это мой текущий код:

BULK INSERT Actuals_Financials_Temp FROM '\\STRMV3302\Temp\Actuals_Financials_Temp.csv' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2) 

Есть ли способ, чтобы обновить строки, которые соответствующие ключи? Или, по крайней мере, игнорировать их, чтобы остальное было загружено, а затем сделать что-то вроде BULK UPDATE?

+1

Вставить в временную таблицу из CSV, обновить, где существует, вставить, если она не существует? может быть грязным. –

+0

Массовые вставки быстрые, потому что они обычно не записывают детали в журнал транзакций. Объемная загрузка в пустую таблицу может быть минимально зарегистрирована. Вместе с тем, слияние данных, вероятно, будет иметь довольно много действий в журнале транзакций, для обновлений существующих записей, индексов и т. Д. Эффективным рабочим процессом будет загрузка данных в пустую таблицу, добавление любых индексов необходимые для соответствия существующим данным, а затем выполнять вставки/обновления, необходимые для существующих данных. –

ответ

3

Не напрямую, нет. Вы должны указать BULK INSERT в промежуточную таблицу, а затем ОБНОВИТЬ существующие записи и ВСТАВИТЬ отсутствующие записи. Сначала я попытался бы с локальной временной таблицей (т. Е. #TableName).

Технически говоря, вы, вероятно, можете сделать одно из следующих действий (оба из которых использует OPENROWSET):

  • Пропустить промежуточную таблицу и использовать OPENROWSET(BULK...) для UPDATE, а затем вставить запросы. Тем не менее, это должно быть проверено, чтобы узнать, стоит ли затратить на чтение файла дважды экономить на том, чтобы не читать его в таблице temp (которая просто записывает его обратно на диск). Возможно, что использование промежуточной таблицы может быть лучше, поскольку первый запрос, UPDATE, может автоматически создать некоторую статистику, которая принесет пользу второму запросу, INSERT, поскольку для этого запроса потребуется либо LEFT JOIN, либо WHERE NOT EXISTS.
  • MERGE вместе с OPENROWSET(BULK...), но MERGE имеет некоторые «проблемы», поэтому я бы не стал пробовать это.