如何在基于集合的语句中导入连接表?

时间:2011-12-27 14:16:37

标签: sql-server sql-server-2008-r2 import

我将平面文件中的数据导入规范化表结构。我目前正在使用游标对相关表进行插入,因此我将主键插入到连接表中。我可以在SQL Server 2008 R2中以基于集合的方式执行此操作吗?

我有3个表:联系人,电话和contactPhones。运行导入后,我希望联系人表中有2个联系人,电话表中有2个联系人,contactPhones表中有2个联系人。真正的导入要复杂得多,但是让它工作将让我将游标的真正导入迁移到基于集合的解决方案。

似乎合并或输出关键字应该能够做我想要的但我无法使语法工作。

这是使用OUTPUT尝试它的代码示例。除非我无法引用import.contactId。

,否则我几乎可以使用它
create table import(contactId int  identity, phone varchar(50), name varchar(10))
create table contacts (contactId int identity, name varchar(50))
create table contactPhone (contactId int, phoneId int)
create table Phones (phoneId int identity, number varchar(10))

go
insert into import (phone, name)
    select '1872', 'dave'
    union (select '9110', 'Jordan')

insert into contacts
    select name from import
insert into Phones (number)
    OUTPUT import.contactId, INSERTED.phoneId into contactPhone
    select phone from import

select * from contactPhone

以下是使用merge进行尝试的代码示例:

create table import(contactId int  identity, phone varchar(50), name varchar(10))
create table contacts (contactId int identity, name varchar(50))
create table contactPhone (contactId int, phoneId int)
create table Phones (phoneId int identity, number varchar(10))

go
insert into import (phone, name)
    select '1872', 'dave'
    union (select '9110', 'Jordan')

insert into contacts
    select name from import

MERGE phones target
    USING (select import.contactId, import.phone, import.name 
            from import join contacts on import.contactId = contacts.contactId) as source
    ON (target.contactId = source.contactId)
    WHEN MATCHED THEN 
        insert into Phones (number)
            OUTPUT import.contactId, INSERTED.phoneId into contactPhone
            select phone from import
    WHEN NOT MATCHED THEN   
        INSERT (name)
        VALUES (source.Name)
        OUTPUT INSERTED.*;



select * from contactPhone

2 个答案:

答案 0 :(得分:2)

mergecontacts上使用Phones并将输出存储在表格变量中,以便在插入contactPhone时使用。

insert into import (phone, name)
select '1872', 'dave' union all
select '9110', 'Jordan'

declare @ContactIDs table(SourceID int primary key, TargetID int)
declare @PhoneIDs table (SourceID int primary key, TargetID int)

merge contacts as c
using import as i
on 0 = 1
when not matched then
  insert (name) values (i.name)
output i.contactId, inserted.contactId into @ContactIDs;

merge Phones as p
using import as i
on 0 = 1
when not matched then
  insert (number) values (i.phone)
output i.contactId, inserted.phoneId into @PhoneIDs;

insert into contactPhone(contactId, phoneId)
select c.TargetID, p.TargetID
from import as i
  inner join @ContactIDs as c
    on i.contactID = c.SourceID
  inner join @PhoneIDs as p
    on i.contactID = p.SourceID  

Using merge..output to get mapping between source.id and target.id

http://data.stackexchange.com/stackoverflow/qt/122662/

答案 1 :(得分:0)

你可以不合并就可以做到这一点。添加联系人和电话,然后创建与导入表匹配的联系电话关系:

insert into contacts
    select name from import;

insert into Phones
    select phone from import;

insert into contactPhone
    select  i.contactId
    ,       p.phoneId
    from    import i
    join    phones p
    on      p.number = i.phone
    join    contacts c
    on      c.name = i.name;