Я хочу сделать массовое копирование данных из одной базы данных в другую. Он должен быть достаточно динамичным, чтобы, когда пользователи исходной базы данных создают новые поля, на конечной стороне (с моей стороны!) Вносились минимальные изменения.
Я сделал это с помощью функции sqlbulkcopy, используя сопоставления столбцов, настроенные в отдельной таблице, так что если создается что-то новое, все, что мне нужно сделать, это создать новое поле и настроить сопоставление ( без изменений кода или хранимой процедуры):
foreach (var mapping in columnMapping)
{
var split = mapping.Split(new[] { ',' });
sbc.ColumnMappings.Add(split.First(), split.Last());
}
try
{
sbc.WriteToServer(sourcedatatable);
}
Однако требования теперь изменились.
Мне нужно хранить больше данных, полученных из других источников, в других столбцах этой таблицы, что означает, что я не могу усечь всю таблицу и записать все с помощью sqlbulkcopy. Теперь мне нужно иметь возможность вставлять новые записи или обновлять соответствующие поля для текущих записей, но при этом быть достаточно динамичным, чтобы мне не потребовались изменения кода, если пользователи создают новые поля.
У кого-нибудь есть какие-либо идеи?
MERGE
. Он довольно гибкий, и, поскольку вы можете определить источник и цель, вы можете динамически записывать полный sql, используя данные сопоставления столбцов. В качестве альтернативы вы можете массово вставить свои исходные данные, используя ваши текущие методы, во временную таблицу, а затем вызвать процедуру (которую вам, возможно, придется обновить при добавлении новых столбцов), которая объединяет их с производственной таблицей, которую вам нужно сохранить. - person mdisibio   schedule 28.04.2014