2

这是场景:

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

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

新系统有一个评论表,允许嵌套评论。所以,它有一个自引用的外键。

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

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

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

现在是使用游标的合适时机吗?根据几乎每个人的建议,我像避免瘟疫一样避免他们。

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

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

4

3 回答 3

1

在我面前没有测试数据库,你可以使用OUTPUTMSSQL 中的关键字来完成。应该足以让你开始:

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
于 2013-11-15T05:59:59.390 回答
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
于 2013-11-26T22:42:09.453 回答
0

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

于 2013-11-26T21:29:29.073 回答