Один механизм, который я видел, состоит в том, чтобы вставить значения во временную таблицу - с той же схемой, что и таблица назначения. Нулевые идентификаторы обозначают новые записи, а заполненные идентификаторы - обновленные записи. Затем используйте команду SQL Merge, чтобы объединить ее с основной таблицей. Слияние будет работать лучше, чем отдельные вставки / обновления.
Делая это индивидуально, вы возьмете на себя обслуживание индексов в таблице - может быть дорогостоящим, если его настроить для выбора. Я считаю, слияние это массовое действие.
Это затронуто здесь:
Какая хорошая альтернатива 368 раз запускать хранимую процедуру для обновления базы данных?
Существуют статьи MSDN о слиянии SQL, поэтому Googling поможет вам в этом.
Обновление: оказывается, что вы не можете объединить (вы можете в 2008 году). Ваша идея иметь другую базу данных обычно обрабатывается репликацией SQL. Опять же, я видел в производстве копию текущей базы данных, которая использовалась для выполнения длительного действия (создание отчетов и агрегация данных в этом случае), однако это не было объединено обратно. Я не знаю, какие возможности объединения доступны в репликации SQL - но это было бы хорошее место, чтобы посмотреть.
Либо это, либо устраните причину, по которой вы не можете выполнить массовую вставку / обновление.
Обновление 2: , как упоминалось в комментариях, вы можете придерживаться идеи временной таблицы, чтобы получить данные в базу данных, а затем вставить / обновить соединение в эту таблицу, чтобы заполнить вашу основную таблицу. Разница в том, что теперь SQL работает с набором, поэтому может соответствующим образом настроить любые перестроения индекса - должно быть быстрее, даже с присоединением.
Обновление 3: Вы можете удалить проверку данных из процесса вставки и перенести ее в службу. Если вы можете остановить вставки в таблицу, пока это происходит, то это позволит вам решить проблему, не позволяющую вам массово вставлять данные (т. Е. Вы проверяете дубликаты на основе значений столбцов, поскольку у вас еще нет такой роскоши, как Я БЫ). В качестве альтернативы для идеи временной таблицы вы можете добавить условие WHERE, чтобы сначала увидеть, существует ли строка в базе данных, что-то вроде:
INSERT INTO MyTable (val1, val2, val3)
SELECT val1, val2, val3 FROM #Tempo
WHERE NOT EXISTS
(
SELECT *
FROM MyTable t
WHERE t.val1 = val1 AND t.val2 = val2 AND t.val3 = val3
)