Слияние строк от двух баз данных

Я имею два (или больше) различные базы данных, тождественно структурированные, но каждый содержащий различные данные.

Как я пошел бы о слиянии данных одной базы данных в другой? Это - более трудная проблема, чем я сначала думал. У меня есть таблица с первичными ключами, таким образом, простой ВЫБОР INSERT INTO db1.table1 * ОТ db2.table1 может перестать работать со сталкивающимися первичными ключами.

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

Существует ли лучший путь? Я смотрел на BCP, но это продолжает работать на основание таблицы, и я собираюсь потерять все свои ссылки (т.е., table2 не будет знать, что первичный ключ в table1 изменился, так не может обновить его идентификатор внешнего ключа).

1
задан DanDan 5 August 2010 в 16:06
поделиться

3 ответа

Если идея заключается в том, что вы хотите добавить записи из 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).

1
ответ дан 2 September 2019 в 22:24
поделиться

Вы можете использовать курсор, который просматривает все строки в 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
1
ответ дан 2 September 2019 в 22:24
поделиться

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

0
ответ дан 2 September 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: