代码之家  ›  专栏  ›  技术社区  ›  DanDan

合并两个数据库中的行

  •  1
  • DanDan  · 技术社区  · 14 年前

    如何将一个数据库的数据合并到另一个数据库中?这是一个比我最初想的更难的问题。我有一个带有主键的表,因此从db2.table1简单地插入db1.table1 SELECT*可能会失败,主键会发生冲突。

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   AllenG    14 年前

    如果您希望将TableA ind DB1中的记录附加到DB2中的TableA,那么这应该相当容易:

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

        2
  •  1
  •   David    14 年前

    您可以使用一个游标来循环db2.table1中的所有行,将每一行添加到db1.table1中,并更新表2中的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
    
        3
  •  0
  •   Beth    14 年前

    您需要决定哪张表是(不可避免的)冲突的赢家。 它可能是某些字段,也可能只是相关表中的记录,而不是主表中的记录。