我有两个(或更多)不同的数据库,结构相同但每个都包含不同的数据。
我如何将一个数据库的数据合并到另一个数据库?这是一个比我想象的更难的问题。我有一个带主键的表,所以一个简单的INSERT INTO db1.table1 SELECT * FROM db2.table1可能会因为主键发生冲突而失败。
如何将新记录插入到表的末尾,允许标识列接管并为我提供新的主键,同时还包含所有外键引用?
有更好的方法吗?我一直在看bcp,但是这可以在每个表的基础上工作,我将丢失所有的引用(即,table2将不知道table1中的主键已更改,因此无法更新其外键ID)。
答案 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)
在发生(不可避免的)冲突时,您需要决定哪个表是赢家。 您可以从业务流程声明获胜者的一个表开始,然后在丢失表中添加没有键冲突的所有记录,然后确定要将丢失表中的多少数据复制到获胜者。 它可能是某些字段,也可能只是不在主表中的相关表中的记录。