Слияние двух баз данных 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 я использовал обходной путь, который может быть применим:

  1. Дамп данных как команды SQL
    (Серия INSERT заявления или что-то еще текстовое и удобное для редактирования)
  2. Отредактируйте дамп и удалите первичные ключи
    (Редактор, который понимает регулярные выражения, может быть полезен здесь, но не является строго необходимым, если он может повторять действие для каждой строки в файле)
  3. Загрузите дамп в базу данных SQL Server
    (Если ключи автоинкрементны и автоматически заполняются как SERIAL введите в Postgres вы должны получить новые ключи для каждого ряда)

Все это основано на том, что это простой способ выгрузить ваши данные в этом формате (или написание быстрого PHP/ASP/ любого скрипта для генерации SQL тоже может сработать...). Также обратите внимание, что этот метод становится немного громоздким с огромными наборами данных - ограничивающим фактором обычно является текстовый редактор, который захлебывается огромным файлом.

Другие вопросы по тегам