1

我有 3 张桌子。

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

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

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

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

现在我的任务是将一些数据从 SourceTable 迁移到 DestinationTable 和 FKSourceTable 到 FKDestinationTable

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

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

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

我遇到的问题是,将 FKSourceTable 迁移到 FKDestinationTable 时如何维护 FK 引用?当我按如下方式对 DestinationTable 进行批量插入时,我忘记了身份:

INSERT INTO DestionationTable
    (Col1, Col2)
SELECT st.Col1, st.Col2
FROM SourceTable st

(DestionationTable 有 3 列:Id、Col1、Col2)

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

有没有人有任何想法来解决这个问题?我尝试过使用 OUTPUT INTO 等,但我还没有找到一种方法来保持原始 ID 和新 ID 之间的引用

任何帮助是极大的赞赏

谢谢南顿。

4

2 回答 2

3

这可能不是最佳解决方案,但应该可以完成工作。

想法是禁用身份插入并根据表中已有的内容自己生成 ID。

它的作用是遍历源数据并将其一次插入目标表中的一行。

请在执行之前彻底检查此代码,因为我自己没有对此进行测试

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
于 2013-06-20T09:08:51.313 回答
0

使用目标表的 Ident_Current 将数据插入目标表

    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 -----

注意:确保这是在事务中完成的,并且事务类型取决于这些表的使用情况

于 2013-06-19T22:59:09.637 回答