合并两个数据库中的行

时间:2010-08-05 16:06:38

标签: sql-server sql-server-2008

我有两个(或更多)不同的数据库,结构相同但每个都包含不同的数据。

我如何将一个数据库的数据合并到另一个数据库?这是一个比我想象的更难的问题。我有一个带主键的表,所以一个简单的INSERT INTO db1.table1 SELECT * FROM db2.table1可能会因为主键发生冲突而失败。

如何将新记录插入到表的末尾,允许标识列接管并为我提供新的主键,同时还包含所有外键引用?

有更好的方法吗?我一直在看bcp,但是这可以在每个表的基础上工作,我将丢失所有的引用(即,table2将不知道table1中的主键已更改,因此无法更新其外键ID)。

3 个答案:

答案 0 :(得分:1)

如果您想要将TableA ind DB1中的记录附加到DB2中的TableA,那么这应该相当简单:

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

但是,使用SQL2k8中的导入数据向导可能更容易,该向导使用SSIS从一个源(在本例中为db2.table1)批量提取数据并将其放在某个目标中(在这种情况下: db1.table1)。

答案 1 :(得分:1)

您可以使用循环认为db2.table1中所有行的游标,将每行添加到db1.table1中,并更新table2中的FK。

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

答案 2 :(得分:0)

在发生(不可避免的)冲突时,您需要决定哪个表是赢家。 您可以从业务流程声明获胜者的一个表开始,然后在丢失表中添加没有键冲突的所有记录,然后确定要将丢失表中的多少数据复制到获胜者。 它可能是某些字段,也可能只是不在主表中的相关表中的记录。