Я имею два (или больше) различные базы данных, тождественно структурированные, но каждый содержащий различные данные.
Как я пошел бы о слиянии данных одной базы данных в другой? Это - более трудная проблема, чем я сначала думал. У меня есть таблица с первичными ключами, таким образом, простой ВЫБОР INSERT INTO db1.table1 * ОТ db2.table1 может перестать работать со сталкивающимися первичными ключами.
Как я могу вставить новые записи в конец таблицы, позволив столбцу идентификационных данных вступить во владение и дав мне новый первичный ключ, в то время как также cascasding все ссылки внешних ключей?
Существует ли лучший путь? Я смотрел на BCP, но это продолжает работать на основание таблицы, и я собираюсь потерять все свои ссылки (т.е., table2 не будет знать, что первичный ключ в table1 изменился, так не может обновить его идентификатор внешнего ключа).
Если идея заключается в том, что вы хотите добавить записи из TableA ind DB1 в TableA в DB2, то это должно быть довольно просто:
INSERT INTO db1.Table1
SELECT [Your Columns Here, but skip the PK]
FROM db2.Table1
Однако, вероятно, было бы проще использовать мастер Import Data из SQL2k8, который использует SSIS для получения данных оптом из одного источника (в данном случае: db2.table1) и помещения их в некоторое место назначения (в данном случае: db1.table1).
Вы можете использовать курсор, который просматривает все строки в db2.table1, добавляет каждую строку в db1.table1 и обновляет FK в table2.
declare myCursor Cursor FOR
SELECT @pk, col1, col2 FROM db2.table1
OPEN myCursor
declare @pk int, @col1 int, @col2 decimal
Fetch NEXT FROM myCursor INTO @pk, @col1, @col2
While (@@FETCH_STATUS = 0)
BEGIN
BEGIN TRANSACTION
INSERT INTO db1.table1 (col1, col2) VALUES (@col1, @col2) -- Assuming your pk is identity column
IF (@@IDENTITY > 0)
BEGIN
UPDATE db1.table2 SET fk = @@IDENTITY WHERE fk = @pk
IF (@@ROWCOUNT > 0)
PRINT 'Success ' + COnvert(varchar, @@IDENTITY)
ELSE
PRINT 'Failed ' + COnvert(varchar, @@IDENTITY)
END
COMMIT
FETCH NEXT FROM myCursor INTO @pk, @col1, @col2
END
CLOSE myCursor
DEALLOCATE myCursor
Вам нужно решить, какой стол станет победителем в случае (неизбежных) конфликтов. Вы можете начать с одной таблицы, объявленной победителем бизнес-процессом, затем добавить все записи без конфликтов ключей из проигрывающей таблицы, а затем решить, какую часть данных из проигравшей таблицы вы хотите скопировать в победившую. Это могут быть определенные поля или только записи в связанных таблицах, а не в основной таблице.