2016-12-04 49 views
0

我正在處理以下情況:我有一張客戶表,其中客戶的地址被保存爲每行的列。如何將這個舊錶遷移到SQL Server中的這兩個新表中?

現在,重新設計後,現在有一個表Addresses爲地址和客戶表引用的地址。

在遷移到這個新結構時,我首先將客戶遷移到新表,並將AddressId列保留爲NULL

然後我開始遷移地址。首先,我心目中的代碼是:

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

現在的問題是,每個刀片進行那裏,從老客戶錶帶到了新的每一個地址,地址ID必須添加到客戶表中相應的客戶行。

我該怎麼做?我如何才能爲每個插入添加參考,方法是將相應客戶的AddressId設置爲剛剛添加的地址ID?

編輯:新客戶表中有很多領域,對這個問題的目的,我們可以認爲它具有以下字段:

  • 客戶編號,
  • AddressId

地址表具有字段

  • AddressId,
  • 地址,
  • 國家

老客戶表只是這一切在一起:

  • 客戶編號,
  • 地址,

我需要將這個舊結構遷移到新結構。因此,我需要將此舊錶的每個客戶條目映射到新客戶條目加上一個地址條目。

我試着先遷移所有的客戶,留下AddressId爲空,稍後再遷移地址,但它不像預期的那樣工作,因爲如果我遷移地址,因爲我在嘗試,我不知道如何添加關係。

+0

請添加表結構和預期的結果 – Sami

+0

@Sami,我已經添加了一些更多的細節問題 – 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