Я импортирую данные из плоского файла в нормализованную структуру таблицы. В настоящее время я использую курсоры для вставки в связанные таблицы, поэтому у меня есть первичные ключи для вставки в таблицу соединений. Могу ли я сделать это на основе набора в SQL Server 2008 R2?
У меня есть 3 таблицы: контакты, телефоны и телефоны для контактов. После запуска импорта я бы хотел, чтобы в таблице контактов было 2 контакта, 2 в таблице телефонов и 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
Вот пример кода, с помощью которого выполняется слияние:
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