Обновление / вставка в таблицу SQL с использованием таблицы данных с сопоставлениями столбцов

Я хочу сделать массовое копирование данных из одной базы данных в другую. Он должен быть достаточно динамичным, чтобы, когда пользователи исходной базы данных создают новые поля, на конечной стороне (с моей стороны!) Вносились минимальные изменения.

Я сделал это с помощью функции sqlbulkcopy, используя сопоставления столбцов, настроенные в отдельной таблице, так что если создается что-то новое, все, что мне нужно сделать, это создать новое поле и настроить сопоставление ( без изменений кода или хранимой процедуры):

foreach (var mapping in columnMapping)
{
    var split = mapping.Split(new[] { ',' });
    sbc.ColumnMappings.Add(split.First(), split.Last());
}

try
{
    sbc.WriteToServer(sourcedatatable);
}

Однако требования теперь изменились.
Мне нужно хранить больше данных, полученных из других источников, в других столбцах этой таблицы, что означает, что я не могу усечь всю таблицу и записать все с помощью sqlbulkcopy. Теперь мне нужно иметь возможность вставлять новые записи или обновлять соответствующие поля для текущих записей, но при этом быть достаточно динамичным, чтобы мне не потребовались изменения кода, если пользователи создают новые поля.

У кого-нибудь есть какие-либо идеи?


person csharper    schedule 07.04.2014    source источник
comment
Различие между двумя частями вашего вопроса: 1) сопоставление динамических столбцов и 2) как вставлять и / или обновлять вместо усечения / массового копирования: вставка / обновление лучше всего решается с помощью оператора MERGE. Он довольно гибкий, и, поскольку вы можете определить источник и цель, вы можете динамически записывать полный sql, используя данные сопоставления столбцов. В качестве альтернативы вы можете массово вставить свои исходные данные, используя ваши текущие методы, во временную таблицу, а затем вызвать процедуру (которую вам, возможно, придется обновить при добавлении новых столбцов), которая объединяет их с производственной таблицей, которую вам нужно сохранить.   -  person mdisibio    schedule 28.04.2014
comment
Спасибо за ваш комментарий. Я взглянул на инструкцию слияния, и мне показалось, что она могла бы сработать за меня. К сожалению, требования и приоритеты снова изменились, поэтому на данный момент это приостановлено. Спасибо еще раз!   -  person csharper    schedule 02.05.2014


Ответы (1)


Прокомментируйте исходный вопрос от mdisibio - похоже, ответом был бы оператор SQL MERGE.

person csharper    schedule 02.05.2014