Слияние строк из двух баз данных - PullRequest
1 голос
/ 05 августа 2010

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

Как мне поступить при объединении данных одной базы данных в другую?Это более сложная проблема, чем я думал.У меня есть таблица с первичными ключами, поэтому простой INSERT INTO db1.table1 SELECT * FROM db2.table1 может завершиться ошибкой при конфликте первичных ключей.

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

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

Ответы [ 3 ]

1 голос
/ 05 августа 2010

Вы можете использовать курсор, который перебирает все строки в db2.table1, добавляет каждую строку в db1.table1 и обновляет FK в таблице 2.

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 голос
/ 05 августа 2010

Если идея заключается в том, что вы хотите добавить записи из TableA ind DB1 в TableA в DB2, то это должно быть довольно просто:

INSERT INTO db1.Table1
SELECT [Your Columns Here, but skip the PK]
FROM db2.Table1

Однако, вероятно, было бы проще использовать мастер импорта данных из SQL2k8, который использует службы SSIS для массового извлечения данных из одного источника (в данном случае: db2.table1) и помещения их в некоторый пункт назначения (в этом случае: db1.table1).

0 голосов
/ 05 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...