Объединение нескольких похожих баз данных MS-Access в 1 базу данных SQL.

У меня есть около 20 баз данных доступа, по одной на каждый год с 1990 по 2010 год. Каждая база данных имеет почти одинаковые таблицы, но уникальные данные в этих таблицах. (Есть несколько уникальных таблиц, но они не очень важны.)

Я использую помощник по миграции SQL Server для доступа, но пока я могу понять, как перенести только одну базу данных доступа в одну базу данных SQL. Возможно ли:

  1. Используйте SSMA для импорта каждой базы данных на мой SQL-сервер, при этом ДОПОЛНЯЯ, а не перезаписывая таблицы, которые уже существуют в целевой базе данных.
  2. Используйте SQL для объединения 20 баз данных (после того, как я импортировал каждую), добавляя вместе любые похожие таблицы.

Каждая база данных имеет несколько сотен таблиц, поэтому я стараюсь избегать ручного решения.

Благодарю вас!


person Zach    schedule 15.03.2011    source источник
comment
Это действительно зависит от данных в столбцах. Весьма вероятно, что вам придется массировать данные, чтобы собрать все в одну таблицу из таблиц в каждой базе данных Access. IE: если в таблицах нет значения года для дифференциации данных (при необходимости), вам придется указать это вручную.   -  person OMG Ponies    schedule 15.03.2011
comment
@OMG Ponies: в каждой таблице уже есть значение года, и я почти уверен, что столбцы одинаковы в таблицах с одним и тем же именем. Я думаю, что простое добавление всех данных в таблицы с тем же именем даст мне то, что я хочу. Я просто не знаю эффективного способа сделать это для ~ 200 таблиц в ~ 20 разных базах данных.   -  person Zach    schedule 15.03.2011
comment
Вероятно, вы также захотите добавить поле во все таблицы, чтобы указать исходную базу данных, чтобы вы могли использовать ее как часть составного ПК вместе со значениями автонумерации (при условии, что вы используете их в качестве суррогатных ПК). Это единственный способ избежать коллизий и поддерживать RI между таблицами.   -  person David-W-Fenton    schedule 15.03.2011
comment
@David-W-Fenton: базы данных доступа в настоящее время не имеют значений первичного ключа или автонумерации. Однако в каждой таблице есть поле, которое однозначно связывает ее с исходной базой данных.   -  person Zach    schedule 15.03.2011
comment
Если в таблицах нет PK, то у вас вообще нет баз данных! Это также означает, что у вас нет проблем с ссылочной целостностью, что, безусловно, облегчает их слияние.   -  person David-W-Fenton    schedule 17.03.2011


Ответы (3)


Если бы вы знали, что ваша структура данных идентична в каждой БД, вы потенциально могли бы сделать какой-нибудь причудливый динамический SQL и sp_msforeachtable для объединения каждой таблицы, если они имеют одно и то же имя в каждой из БД.

Я думаю что-то вроде:

DECLARE @SQL Varchar(max)

SET @SQL ='
SELECT *
INTO MergedDb.?
FROM DB1.?
UNION ALL
SELECT *
FROM DB2.?
UNION ALL
SELECT *
FROM DB3.?
...'

exec sp_MSforeachtable @SQL

Это НЕ будет правильно обрабатывать конфликты типов данных, и если у вас есть какие-либо значения идентификатора, это вообще не будет работать.

person JNK    schedule 15.03.2011
comment
Я думаю, это может сработать. Я почти уверен, что типы данных согласуются между базами данных, поэтому проблем быть не должно. Я дам вам знать, если это сработает. - person Zach; 15.03.2011
comment
Спасибо, я буду! У меня есть резервная копия данных на другой машине, поэтому, если я действительно облажаюсь, я могу повторно импортировать базы данных доступа в SQL. - person Zach; 15.03.2011
comment
У меня возникли проблемы с запуском сценария, который вы опубликовали... Я использую экспресс-студию управления Microsoft SQL. Я сделал новый запрос и вставил в него имена моей объединенной БД и исходных БД. Однако запрос, похоже, не выполняется. Что я могу делать неправильно? - person Zach; 16.03.2011

вам придется делать каждую базу данных вручную, но вы можете попробовать использовать мастер импорта данных сервера sql.

person DForck42    schedule 15.03.2011

Сделайте правильный нормализованный дизайн вашей глобальной базы данных. Затем импортируйте свои 20 баз данных MDB в 20 баз данных SQL и консолидируйте их вручную, с помощью скрипта или комбинации того и другого. Думаю, что руками будет быстрее.

person Patrick Honorez    schedule 15.03.2011