0

列を持つ Customers テーブルを持つ既存の SQL Server データベースがあります。

Customers:  CustomerId (PK), A, B, C, D, E, F 

最後の 3 列は住所を表します。これらの住所列を別の Addresses テーブルに抽出し、FK でリンクして、同時にデータを移行したいと考えています。だから私は次のようになります:

Customers:  CustomerId (PK), A, B, C, AddressId (FK)

Addresses:  AddressId (PK), D, E, F

Address は最終的に他の多くのテーブルからも参照されるため、データベースで生成された独自の独立した AddressId が必要です。Customer と同じ ID を共有することはできません。また、Address に Customer への FK を含めることもできません。スキーマは次のようにする必要があります。

私はSQLにあまり精通していません。SQL で、新しい Addresses テーブルを作成し、データをコピーして、Customers から冗長な列を削除することに問題はありません。しかし、データベースで生成された AddressId を FK として Customer に戻す方法がわかりません。カーソルなどを使用したある種の手続き型アプローチに頼る必要がありますか?または、この移行全体を1つの宣言型SQLクエリで行う方法はありますか? ありがとう。

(注: 最終的には Code First Migrations 内でこれを実行できるようにしたいと考えています。)

4

1 に答える 1

0

私は最終的に答えを見つけました。ソース テーブルとターゲット テーブルの両方から一時テーブルに列を出力できるようにするには、Merge を使用する必要があります。

Declare @MyTableVar table(
 CustomerId int not null,
 AddressId int not null
);

Merge into dbo.Addresses    
using (select CustomerId, D,E,F from dbo.Customers) as addressDetails
on 1=0
when not matched then 
insert ( D,E,F) values ( Customers.D, Customers.E, Customers.F)
output addressDetails.CustomerId, inserted.AddressId into @MyTableVar;
update Customers  set AddressId =
 (Select AddressId from @MyTableVar where CustomerId = Customers.CustomerId );
于 2013-10-30T15:10:27.123 に答える