Я импортирую данные из плоского файла в нормализованную структуру таблицы. В настоящее время я использую курсоры для вставки в связанные таблицы, поэтому у меня есть первичные ключи для вставки в таблицу соединений. Могу ли я сделать это на основе набора в 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