如何将此旧表迁移到SQL Server中的这两个新表?

时间:2016-12-04 20:49:13

标签: sql sql-server database sql-server-2016

我处理以下情况:我有一个客户表,其中客户的地址被保存为每行的列。

现在,在重新设计之后,现在有一个表Addresses用于地址,而客户表引用该地址。

在迁移到此新结构时,我首先将客户迁移到新表,离开AddressIdNULL

然后我开始迁移地址。首先,我想到的代码是:

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

现在,问题是对于在那里执行的每个插入,对于从旧客户表到新客户表的每个地址,必须将地址ID添加到客户表中的相应客户行。

我该怎么做?如何通过将相应客户的AddressId设置为刚添加的地址ID,为每个插入添加引用?

编辑:新的客户表有很多字段,出于问题的目的,我们可以认为它有以下字段:

  • 客户ID,
  • AddressId

地址表包含字段

  • AddressId,
  • 地址,
  • 国家

旧的客户表就是这一切:

  • 客户ID,
  • 地址,
  • 国家

我需要将这个旧结构迁移到新结构。所以我需要将这个旧表的每个客户条目映射到一个新的客户条目加上一个地址条目。

我首先尝试迁移所有客户,留下AddressId null,以便稍后迁移地址但是它没有按预期工作,因为如果我迁移地址就​​像我尝试一样,我不知道如何添加关系。

1 个答案:

答案 0 :(得分: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!)