SSIS заполняет таблицу перекрестных ссылок

Таблицы назначения выглядят следующим образом:

введите здесь описание изображения

Исходная таблица выглядит так:

Клиент

CustomerId Имя Фамилия Адрес электронной почты1 Address2 Почтовый индекс города

Таблица Person в пункте назначения является базовой таблицей (которая позже будет унаследована новой таблицей клиентов). Итак, я пытаюсь экспортировать строку из одной таблицы и заполнить 3 таблицы в месте назначения.

Мне удалось сделать это следующим образом:

  1. Получить записи из исходной таблицы (Клиент)
  2. Создать пустое поле AddressId
  3. Заполнить таблицу адресов с помощью командной задачи OLE DB (она вызывает хранимую процедуру, которая возвращает SCOPE_IDENTITY(), сопоставленную с полем AddressId)
  4. Повторите шаг 3 для заполнения таблицы Person (и получения PersonId
  5. Заполните таблицу перекрестных ссылок PersonAddress, используя поля PersonId и AddressId.

Скриншот этого пакета ниже.

Самая большая проблема с этим подходом заключается в том, что задача команды OLE DB вставляет строку за строкой, что делает весь пакет чрезвычайно медленным. Можно ли добиться того же, но используя быструю загрузку?

введите здесь описание изображения

Я могу сделать это с помощью командной задачи OLE DB, которая вызывает хранимую процедуру, а затем


person ilija veselica    schedule 19.02.2015    source источник
comment
Сейчас у меня нет времени на подробный ответ, но я предлагаю вам вставить исходные данные в промежуточную таблицу, а затем выполнить массовую вставку в другие таблицы (используя INSERT / SELECT), обновив до дополнительных ключевых столбцов в промежуточной таблице. Не возитесь со всеми игрушками в SSIS, они медленные и переоценены. Просто импортируйте в промежуточную таблицу и запустите SQL. Также PersonAddress и Address имеют один и тот же первичный ключ. Зачем их разделять?   -  person Nick.McDermaid    schedule 19.02.2015


Ответы (1)


Я не думаю, что вам нужен SSIS. Вы можете использовать предложение OUTPUT инструкции INSERT, которая возвращает все ключи идентификации во временную таблицу.

Попробуем воспроизвести ваш сценарий...


set nocount on

go
create table Customer (CustomerId int, CustomerName varchar(100) null, Address1 varchar(100) null, Address2 varchar(100) )
create table [Person] (PersonId int identity, PersonName varchar(100) null)
create table [Address] (AddressId int identity, AddressLine varchar(100) null)
create table [PersonAddress] (AddressId int, PersonId int )
go

-- create some data...
insert into Customer (CustomerId)   values ( 1000000 +  convert(int,  RAND() * 1000000) )
go 1000 

update Customer
set CustomerName = 'CustomerName ' + convert(varchar, CustomerId),
    Address1 = 'Address1 ' + convert(varchar, CustomerId),
    Address2 = 'Address2 ' + convert(varchar, CustomerId)
go



declare @identities_Person table ([rownumber] int identity,   id int)
declare @identities_Address table ([rownumber] int identity,  id int)

insert into Person (PersonName)
output  inserted.PersonId into @identities_Person
select
    c.CustomerName      
from  Customer c 
order by c.CustomerId

insert into [Address] (AddressLine)
output  inserted.AddressId into @identities_Address
select
    c.Address1
from  Customer c 
order by c.CustomerId

insert into [PersonAddress] (PersonId, AddressId)           
select p.id, a.id
from @identities_Address a
inner join @identities_Person p on p.rownumber = a.rownumber

select *
from PersonAddress pa
inner join [Address] a on a.AddressId = pa.AddressId
inner join [Person] p on p.PersonId = pa.PersonId
person Edson Dias    schedule 30.03.2015