2016-12-04 6 views
0

私は次のような状況に取り組んでいます。顧客の住所が各行の列として保存される顧客テーブルがあります。この古いテーブルをSQL Serverの新しい2つのテーブルに移行する方法はありますか。

ここで、デザインを変更した後、住所用のテーブルAddressesがあり、顧客テーブルがアドレスを参照しています。

この新しい構造に移行する際には、最初にAddressId列を残して顧客を新しい表に移行しましたNULL

次に、アドレスを移行するように設定しました。まず、私が考えているコードは次のとおりです。今

INSERT INTO Addresses (
    Address, 
    City, 
    State 
) SELECT 
    Address, 
    City, 
    State 
FROM OldDatabase.dbo.Customers 

、問題が実行された各挿入のために、新しいものに古い顧客テーブルから取られたアドレス毎に、アドレスIDが追加されなければならないということです顧客テーブル内の対応する顧客列。

どうすればいいですか?対応する顧客のAddressIdを追加したばかりのアドレスIDに設定することで、これらの挿入のそれぞれについて、どのように参照を追加できますか?

EDIT:新規顧客のテーブルには、質問の目的のために、我々はそれがフィールドを持っていると考えることができ、フィールドをたくさん持っている:

  • のCustomerId、

をあるAddressIdアドレステーブルには、フィールドがあります。

  • AddressId、
  • 住所、
  • 市、

古い顧客テーブルが一緒にちょうどこのすべてのでした:

  • のCustomerId、
  • 住所、
  • 市、
  • 状態

この古い構造を新しい構造に移行する必要があります。そこで、この古いテーブルの各顧客エントリを新しい顧客エントリの1つのアドレスエントリにマッピングする必要があります。

AddressIdをnullのままにして、すべての顧客を移行してみましたが、後でアドレスを移行することになりましたが、期待通りに機能しません。アドレスを移行すると、関係。

+0

あなたのテーブル構造を追加してください。期待通りの結果 – Sami

+0

@Sam、私は質問にいくつかの詳細を追加しました – user1620696

答えて

1

あなたは、挿入から得ているAddressIDを追跡し、Customersテーブルを更新する必要があります。以下は少し速く緩い(つまりエラー処理なし)が、基本的な考え方を示しています。

declare @Addresses table (AddressID int) 
begin tran 

    INSERT INTO Addresses (
     Address, 
     City, 
     State 
    ) 
    output Inserted.AddressID into @Addresses 
    SELECT 
     Address, 
     City, 
     State 
    FROM OldDatabase.dbo.Customers 

    where CustomerID = @CustomerID; 

    update OldDatabase.dbo.Customers 
    set AddressID = (select top(1) AddressID from @Addresses) 

commit tran 

あなたがお客様をループでこれをやっている場合は、顧客間@Addressesテーブルをクリアすることを確認してください(そうでない場合は、すべての顧客のレコードが同じのAddressIdを取得します!)

+0

ありがとう@BenThul、それはとてもうまくいった! – user1620696

関連する問題