5

SQLServer2005を使用しています。

現在のデータベース(単一のテーブル)から新しいデータベース(正規化された-多くのテーブル)にデータを移行しています。新しいデータベースには、ベーステーブル(「BaseTable」と呼びましょう)と他の複数のテーブル(と呼びましょう)"DependentA"があり"DependentB"ます。古いデータベースのデータの一部はBaseTableに送られ、一部は他の2つに送られます。BaseTableは、DependentAとDependentBの両方と1対1の関係にあり、それらのIDを外部キーとして使用します。

これが私の質問です。データをどのように移行する必要がありますか?これが私が試したクエリです。1つを除いて機能しています。他の2つのBaseTableの外部キーは同一であるか、それぞれ異なるものです。

Begin SQL:

BEGIN TRANSACTION

DECLARE @dep1Id int

DECLARE @dep2Id int

INSERT INTO DependentA (column1, column2)
SELECT c1, c2
FROM OldDatabase.OldTable
SELECT @dep1Id = Scope_Identity()

INSERT INTO DependentB (column3, column4)
SELECT c3, c4
FROM OldDatabase.OldTable
SELECT @dep2Id = Scope_Identity()

INSERT INTO BaseTable (column5, dependentTable1Id, dependentTablr2Id)
SELECT c5, @dep1Id, @dep2Id
FROM OldDatabase.OldTable

COMMIT
4

4 に答える 4

7

問題は、@dep1Idと@dep1Idがスカラーであり、2つのセットベースの挿入からの最後の値のみを保持していることです。

これは1回限りなので、おそらくカーソルとして実行する必要があります

DECLARE CURSOR @curs FOR
SELECT c1,c2,c3,c4,c5 FROM OldDatebase

open @curs
fetch next from @curs into
@c1,@c2,@c3,@c4,@c5 --declare these!

while @@fetch_status <> 0
BEGIN

INSERT INTO DependentA (column1, column2) VALUES @c1, @c2

SELECT @dep1Id = Scope_Identity()

INSERT INTO DependentB (column3, column4) VALUES @c3, @c4 

SELECT @dep2Id = Scope_Identity()

INSERT INTO BaseTable (column5, department1Id, department2Id) @c5, @dep1Id, @dep2Id    

fetch next from @curs into
@c1,@c2,@c3,@c4,@c5
END
close @curs
deallocate @curs

私のカーソル構文はおそらくエラーだらけですが、あなたはその考えを理解しています。

于 2010-02-10T23:04:29.130 に答える
4

大きなデータセットのカーソルを回避するには、新しいテーブルにOldTable_idを一時的に含めます。

BEGIN TRANSACTION

INSERT INTO DependentA (OldTable_id, column1, column2)
SELECT ot.id, ot.c1, ot.c2
FROM OldDatabase.OldTable ot

INSERT INTO BaseTable (OldTable_id, column5)
SELECT ot.id, ot.c5
FROM OldDatabase.OldTable ot

UPDATE BaseTable 
    SET BaseTable.dependentTable1_id = DependentA.id
    FROM BaseTable
    INNER JOIN DependentA on DependentA.OldTable_id = BaseTable.OldTable_id

COMMIT

DependentBテーブルおよびOldTableから正規化されている他のテーブルについても同じようにします。

データ移行後にOldTable_idを削除します。

于 2012-03-15T15:37:05.717 に答える
1

[ここに画像の説明を入力してください][1]ZeorOneは、データを取得して、それぞれ0個と1個のテーブルに挿入するメインテーブルです。

select idzero,namezero,idone,nameone from zeroone

insert into zero 
select idzero,namezero from zeroone

insert into one
select idone,nameone from zeroone

または、カーソルを使用して、Zerooneから選択した列のデータを2つのテーブルに挿入する場合、クエリはここにあります

Declare @idzero int
Declare @namezero varchar(50)
Declare @idone int
Declare @nameone varchar(50)

Declare Cur Cursor  for
select idzero,namezero,idone,nameone from zeroone

open Cur

fetch Cur into @idzero,@namezero,@idone,@nameone

While @@fetch_status = 0
begin 

    insert into zero 
    select @idzero,@namezero 

    insert into one
    select @idone,@nameone 

    fetch Cur into @idzero,@namezero,@idone,@nameone

end 

close Cur
Deallocate Cur
于 2017-10-24T06:25:46.040 に答える
0
DECLARE @Product_Name varchar(50),@Generic_Name varchar(50),@Category_Name varchar(50),@Manufacture_Name varchar(50),
@UOM_Name varchar(50),@ProductId int,@GenericId int,@CategoryId int,@ManufactureId int,@UOMId int

DECLARE MultiplTable CURSOR FOR
SELECT ProductName,GenericName,CategoryName,ManufacturerName,UOMName from Noor_ProductList

open MultiplTable
fetch next from MultiplTable into
@Product_Name,@Generic_Name,@Category_Name,@Manufacture_Name,@UOM_Name --declare these!

while @@fetch_status = 0
BEGIN
INSERT INTO Noor_GenericMaster(GenericName) VALUES (@Generic_Name) 
SELECT @GenericId = Scope_Identity()

INSERT INTO Noor_CategoryMaster(CategoryName) VALUES (@Category_Name) 
SELECT @CategoryId = Scope_Identity()

INSERT INTO Noor_ManufaturerMaster(ManufaturerName) VALUES (@Manufacture_Name) 
SELECT @ManufactureId = Scope_Identity()

INSERT INTO Noor_UOMMaster(UOMName) VALUES (@UOM_Name)
SELECT @UOMId = Scope_Identity()

INSERT INTO Noor_ProductMaster (ProductName,GenericID,CategoryID,ManufaturerID,UOMID)
values (@Product_Name,@GenericId,@CategoryId,@ManufactureId,@UOMId)
SELECT @ProductId = Scope_Identity()  

fetch next from MultiplTable into @Product_Name,@Generic_Name,@Category_Name,@Manufacture_Name,@UOM_Name

END
close MultiplTable
deallocate MultiplTable
于 2020-10-08T12:23:04.947 に答える