Sql server 使用t-sql迁移数据时维护外键引用

Sql server 使用t-sql迁移数据时维护外键引用,sql-server,tsql,foreign-keys,Sql Server,Tsql,Foreign Keys,我有三张桌子 1) SourceTable—包含一些数据的源表 2) DestinationTable—与源表具有相同架构的目标表。两个表都有类似的数据类型 3) FKSourceTable-对SourceTable具有FK引用的完全不同的表 4) FKDestinationTable-一个完全不同的表,它具有对DestinationTable的FK引用。与FKSourceTable具有相同的架构 现在我的任务是将一些数据从SourceTable迁移到DestinationTable,并将FKS

我有三张桌子

1) SourceTable—包含一些数据的源表

2) DestinationTable—与源表具有相同架构的目标表。两个表都有类似的数据类型

3) FKSourceTable-对SourceTable具有FK引用的完全不同的表

4) FKDestinationTable-一个完全不同的表,它具有对DestinationTable的FK引用。与FKSourceTable具有相同的架构

现在我的任务是将一些数据从SourceTable迁移到DestinationTable,并将FKSourceTable迁移到FKDestationTable

但是,我无法迁移主键,因为DestinationTable可能有自己的记录具有相同的PK,这可能会造成PK冲突

DestinationTable作为PK的自动标识列,当我进行批量插入时,我不会指定PK列,因此自动标识将完成其工作

这意味着DestinationTable中的新记录将具有全新的ID

我遇到的问题是,在将FKSourceTable迁移到FKDestinationTable时,如何维护FK引用?当我按如下方式对DestinationTable执行大容量插入时,我会丢失标识的踪迹:

INSERT INTO DestionationTable
    (Col1, Col2)
SELECT st.Col1, st.Col2
FROM SourceTable st
(DestinationTable有3列:Id、Col1、Col2)

挑战在于我不能使用SSIS或任何其他ETL解决方案。我需要能够用一个简单的SQL脚本来实现这一点

有人有办法解决这个问题吗?我已经尝试过使用OUTPUT-INTO-etc,但是我还没有找到一种方法来保持原始Id和新Id之间的引用

非常感谢您的帮助

多谢各位
Nandun.

使用目标表的当前标识将数据插入目标表

    DECLARE @ID  INT = IDENT_CURRENT('DestionationTable')

    INSERT INTO DestionationTable
        (ID, Col1, Col2)
    SELECT @ID + ROW_NUMBER() OVER(ORDER BY st.ID),st.Col1, st.Col2
    FROM SourceTable st
    WHERE -----
现在您有了关于源表中的每个ID=目标表中的哪个ID的信息

    SELECT @ID + ROW_NUMBER() OVER(ORDER BY st.ID) [NEW_ID], st.ID [OLD_ID]
    FROM SourceTable st
    WHERE -----

注意:确保这是在事务中完成的,并且事务类型取决于这些表的使用情况。这可能不是最理想的解决方案,但应该可以完成任务

其想法是禁用标识插入,并根据表中已有的内容自行生成标识

这样做的目的是迭代源数据,并将其一次插入到目标表中的一行

请在执行之前仔细检查此代码,因为我自己没有测试此代码

declare @col1 varchar(20)
declare @col2 varchar(20)
declare @col3 varchar(20)
declare @new_id int

set identity_insert on

declare source_data cursor for
select col1, col2, colx
from SourceTable

open source_data

fetch next from source_data 
into @col1, @col2, @col3

WHILE @@FETCH_STATUS = 0
begin
  set @new_id = select MAX(ID) + 1 from SourceTable

insert into DestinationTable (ID, col1, col2, col3) values (@new_id,@col1,@col2,@col3)
-- do something similar for FKDestinationTable
insert into FKDestinationTable (ID, col1, col2, col3) values (@new_id,@col1,@col2,@col3)

fetch next from source_data
into @col1, @col2, @col3 
end 

set identity_insert off

谢谢你的这种方法。我有多么担心MAX(ID)+1,因为我的数据不是完全连续的。记录会不时被删除,并且MAX ID不会给出正确的ID。。我多么渴望使用这种方法,用一个IDENT_CURRENT代替MAX(ID)。唯一的问题是我希望不用游标就能完成这项工作。虽然我不想使用游标和循环,但我成功地使用了这种方法。因此,将此标记为答案。如果您使用的是SQL Server 2008+,请查看中讨论的方法。