2

シナリオは次のとおりです。

古いシステムから新しいシステムにデータを移行しています。

古いシステムには、コメントとその返信を表す 2 つのテーブルがありました。

新しいシステムには、ネストされたコメントを許可するコメント用の単一のテーブルがあります。したがって、自己参照の外部キーがあります。

2 つのテーブルから 1 つのテーブルにデータを移動する必要があります。

ここに問題があります。どのサブコメントがどの親コメントに関連しているかはわかっていますが、新しいテーブルへの挿入を行っている間、親コメントの新しい ID はわかりません。

while ループを使用して各親コメントをループし、ループ内で 2 つの挿入を実行することを検討しました。

これはカーソルを使用する適切な時期ですか? ほぼ全員の推奨に従って、私は疫病のようにそれらを避けます.

データを 2 つのテーブルから 1 つに移動する別の方法を考えられますか?

これはすべて、別の while ループ内で発生しています。また、このループをネストするのではなく、別のループに分割する必要があるかどうかも疑問に思っています。

4

3 に答える 3

1

私があなたの問題を理解していれば、挿入を 2 段階で行うことができます。最初にコメントを挿入して、テーブルに古い ID を保持し、古いコメントを参照して子 (古い返信) を 2 番目に挿入します。

新しいテーブルを変更したくない場合は、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 に答える
1

OUTPUT目の前にテスト データベースがなくても、MSSQL のキーワードを使用して実行できます。あなたが始めるのに十分なはずです:

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 に答える
0

したがって、SQL 2008 以降を使用している場合は、キーワードを使用してMERGEステートメントを使用できるようです。残念ながら、ステートメントOUTPUTを持たない SQL 2005 をサポートする必要があります。MERGEネストされたループを使用することになりました。

于 2013-11-26T21:29:29.073 に答える