Как мне импортировать в таблицу соединений в операторе на основе набора?

Я импортирую данные из плоского файла в нормализованную структуру таблицы. В настоящее время я использую курсоры для вставки в связанные таблицы, поэтому у меня есть первичные ключи для вставки в таблицу соединений. Могу ли я сделать это на основе набора в SQL Server 2008 R2?

У меня есть 3 таблицы: контакты, телефоны и contactPhones. После запуска импорта я хотел бы, чтобы в таблице контактов было 2 контакта, 2 - в таблице телефонов и 2 - в таблице contactPhones.Реальный импорт значительно сложнее, но его работа позволит мне перенести реальный импорт с курсоров на решение на основе набора.

Похоже, ключевые слова слияния или вывода должны иметь возможность делать то, что я хочу, но мне не удалось заставить синтаксис работать.

Вот пример кода, использующего 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

Вот пример кода, пытающегося выполнить слияние:

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
6
задан David Silva Smith 27 December 2011 в 14:16
поделиться