Слияние двух баз данных SQL Server
Я хотел бы импортировать данные из одной базы данных SQL Server в другую. Обе БД имеют одинаковые определения таблиц и т. Д., Но разные данные. Первичные ключи имеют автоинкрементное значение, поэтому один и тот же первичный ключ будет ссылаться на разные данные в обеих БД.
Мне нужно обновить первичные ключи от второй БД (и, очевидно, любые внешние ключи, которые ссылаются на них) при вставке в первую. Мне все равно, если данные дублируются на данный момент. Есть ли способ сделать это?
2 ответа
Вы не сказали, какая версия. Поскольку мы говорим о SQL Server, есть несколько способов подойти к этому. Если вы используете SQL Server 2005/2008, самый простой способ - использовать функцию импорта данных в SQL Server Management Studio. Фактически, это создает пакет служб SSIS, который позволяет вам вносить данные в объединенную базу данных. Это простой подход к пакету служб SSIS, поэтому могут возникнуть проблемы с внешними ключами.
В противном случае другой вариант - использовать bcp для экспорта данных из таблицы (таблиц), однако без ссылок на первичный / внешний ключ. Это поместит данные в текстовые файлы. В этот момент вы можете использовать BULK INSERT для переноса данных в объединенную базу данных. Здесь есть оговорка: если столбцы, в которых находятся внешние ключи, не допускают значения NULL, такой подход будет проблематичным.
Третий вариант - написать сценарии самостоятельно, и это тоже довольно легко сделать. Вы можете взять вторую базу данных, если ее еще нет на вашем SQL Server, и присоединить ее к SQL Server, где будет находиться объединенная база данных. Соединение с подключенным сервером тоже может работать, но в целом оно будет намного медленнее. Затем вы можете написать свои операторы INSERT соответствующим образом, оставив поля первичного ключа. Для таблиц с ссылками на внешний ключ вы можете использовать JOIN для получения правильных значений для ссылок, если вы загружаете таблицы в правильном порядке.
Четвертый вариант - создать пользовательский пакет служб SSIS и загрузить таблицы по порядку, а также выполнить поиск, чтобы убедиться, что у вас есть правильные ссылочные значения внешнего ключа. Это немного сложнее, чем первый шаг, но это гарантирует, что вы все сделаете правильно. Кроме того, если вам придется повторить это упражнение, у вас уже есть пакет. Еще одним преимуществом является то, что вам не нужно создавать соединение с сервером, и он будет использовать самые быстрые методы вставки в объединенную базу данных.
Хорошо, поскольку у вас есть то, что звучит в основном как непересекающиеся данные (и все равно, если у вас появятся какие-то дубликаты), в Postgres я использовал обходной путь, который может быть применим:
- Дамп данных как команды SQL
(СерияINSERT
заявления или что-то еще текстовое и удобное для редактирования) - Отредактируйте дамп и удалите первичные ключи
(Редактор, который понимает регулярные выражения, может быть полезен здесь, но не является строго необходимым, если он может повторять действие для каждой строки в файле) - Загрузите дамп в базу данных SQL Server
(Если ключи автоинкрементны и автоматически заполняются какSERIAL
введите в Postgres вы должны получить новые ключи для каждого ряда)
Все это основано на том, что это простой способ выгрузить ваши данные в этом формате (или написание быстрого PHP/ASP/ любого скрипта для генерации SQL тоже может сработать...). Также обратите внимание, что этот метод становится немного громоздким с огромными наборами данных - ограничивающим фактором обычно является текстовый редактор, который захлебывается огромным файлом.