在查询中为单行执行多次插入

时间:2013-07-11 09:08:52

标签: sql sql-server-2008 sql-insert

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

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

考虑我已经填充了这个表

tblCompany

  • CompanyId
  • CompanyName
  • RegNo
  • ContactForename
  • ContactSurname

我想将联系人数据迁移到

tblPerson

  • PersonID(identitycolumn)
  • 用名字

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

tblCompanyPerson

  • CompanyId
  • PERSONID

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

我最接近的是在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已经安装了数十万个 记录。

2 个答案:

答案 0 :(得分:1)

有一个'技巧'使用MERGE语句来实现新插入值和源值之间的映射:

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条件是始终从源头获取所有内容。您可能希望用一些子查询替换它甚至整个源,以实际检查您已经拥有相同人物的任何内容。

编辑:Here is some reading about using MERGE and OUTPUT

答案 1 :(得分: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

Sarajog

相关问题