SQL迁移脚本 - 嵌套循环

时间:2013-11-15 01:19:48

标签: sql sql-server data-migration

以下是该方案:

我正在将数据从旧系统迁移到新系统。

旧系统有2个表,代表评论及其回复。

新系统有一个用于注释的表,允许嵌套注释。因此,它有一个自引用外键。

我需要将2个表中的数据移动到1。

这是问题所在: 虽然我知道哪些子注释与哪些父注释相关,但是我在插入新表时,我不知道父注释的新ID。

我考虑使用while循环遍历每个父注释,然后在循环内执行2次插入。

这是使用光标的合适时间吗?根据几乎每个人的建议,我像瘟疫一样避免它们。

您能想到一种将数据从2个表移动到1的不同方法吗?

所有这一切都发生在另一个while循环中。我也想知道我是否应该尝试将这个循环分解为一个单独的循环而不是嵌套它们。

3 个答案:

答案 0 :(得分:1)

如果没有我前面的测试数据库,您可以使用MSSQL中的OUTPUT关键字来完成。应该足以让你入门:

DECLARE @NewIDs Table
(
  NewID INT,
  OldID INT
)

INSERT INTO NewTable
OUTPUT NewTable.ID,
       OldTable.ID
INTO   @NewIDs
SELECT NULL As ParentCommentID, Othercolumns
FROM   OldParentTable

INSERT INTO NewTable
SELECT NewID As ParentCommentID, OtherColumns
FROM   OldChildTable
JOIN   @NewIDs NewIDs
    ON NewIDs.OldID = OldChildTable.OldParentTableID

答案 1 :(得分:1)

如果我理解你的问题,你可以分两个阶段进行插入,第一次插入注释,保留表中的旧ID,以便参考旧注释进行第二次插入子(旧回复)。

如果您不想更改新表

,也可以使用单独的表进行ID
if object_id('oldReply') is not null
    drop table oldReply
if object_id('oldComment') is not null
    drop table oldComment
if object_id('newComment') is not null
    drop table newComment
go  
create table oldComment (
    id integer identity(1,1) primary key,
    msg varchar(64)
    )
create table oldReply(
    id integer identity(1,1)  primary key,
    msg varchar(64),
    commentId integer references oldComment(id)
    )
create table newComment (
    id integer identity(1,1) primary key,
    msg varchar(64),
    parentId integer references newComment(id),
    oldCommentId integer
)
go
insert into oldComment(msg) values ('m1'), ('m2'), ('m3')
insert into oldReply(msg, commentId) values ('r1', 1) , ('r2', 2), ('r3', 3)

select * from oldComment
select * from oldReply

insert into 
newComment( msg, oldCommentId)
    select msg, id from oldComment 
    ;
insert into newComment (msg, parentId)  
    select oldREply.msg, parent.id
    from oldReply
    inner join newComment parent on oldReply.commentId = parent.oldCommentId
    ;
--to check
select * from newComment

答案 2 :(得分:0)

因此,如果我使用的是SQL 2008或更高版本,我可以将MERGE语句与OUTPUT关键字一起使用。不幸的是,我需要支持没有MERGE语句的SQL 2005。我最终使用了嵌套循环。