0

我有一个表,其中包含我需要迁移到另一个带有链接表的表的数据。这是作为升级一部分的一次性迁移。

我有一个公司表,其中包含与公司和联系人相关的记录。我想将联系人详细信息迁移到另一个表中,并将新人与链接表链接

考虑我有这个已经填充的表

tbl公司

  • 公司编号
  • 公司名称
  • 注册号
  • 联系人姓名
  • 联系人姓氏

我想将联系人数据迁移到

tblPerson

  • PersonID(身份列)
  • 名字

并使用生成的标识列并将其插入到链接表中

tbl公司人

  • 公司编号
  • 个人身份

我已经尝试了几种不同的方法来使用游标和输出变量到临时表中来解决这个问题,但对我来说似乎都不对(或者给我解决方案......)

我得到的最接近的是在 tblPerson 上有一个 companyID 并将 companyId 插入其中并将新的 personId 和 companyId 输出到临时表中。然后循环遍历临时表以创建 tblCompanyContact。

例子

declare @companycontact TABLE (companyId int, PersonId int)

insert into tblPerson
    (Forename,
    Surname,
    CompanyID)
output inserted.CompanyID, INSERTED.PersonID into @companycontact
select  
    ContactPersonForeName, 
    ContactPersonSurename,  
    CompanyID
from tblCompany c


insert into tblCompanyPerson
    (CompanyID,
    PersonID)
select c.companyId, PersonId from @companycontact c

背景

  • 我正在使用 MS SQL Server 2008 R2
  • tblPerson 已经填充了数十万条记录。
4

2 回答 2

1

有一个“技巧” usingMERGE语句来实现新插入的值和源值之间的映射:

MERGE tblPerson trgt
USING tblCompany src ON 1=0
WHEN NOT MATCHED 
THEN INSERT 
    (Forename, Surename)
    VALUES (src.ContactPersonForeName, src.ContactPersonSurename)
OUTPUT  src.CompanyID, INSERTED.PersonID
INTO  tblCompanyPerson (CompanyId, PersonID);

1=0 的条件是始终从源获取所有内容。您可能想用一些子查询替换它甚至整个源,以实际检查您已经映射了同一个人的任何内容。

编辑:这是一些关于使用MERGEOUTPUT

于 2013-07-11T09:44:00.027 回答
0

因为我不知道您使用的是什么 SQL,所以很难确定这是否正确。我也不知道你是否已经尝试过,但这是我最好的主意:

insert into tblPerson
(Forename, Surename)
Select ContactForename, ContactPersonSurename
from tblCompany

insert into tblCompanyPerson
(CompanyID, PersonID)
select CompanyId, PersonID 
from tblPerson, tblCompany
where ContactForename = Forename and ContactPersonSurename = Surename

萨拉约格

于 2013-07-11T09:25:06.653 回答