sql - referencias - Tabla de referencia cruzada que completa SSIS
pivot multiples columnas sql server (1)
No creo que necesites SSIS. Puede usar la cláusula OUTPUT de INSERT que devuelve todas las claves de identidad a una tabla temporal
Intentemos reproducir su escenario ...
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
Las tablas de destino se ven así:
La tabla fuente se ve así:
Cliente
CustomerId Nombre Apellido Dirección de correo electrónico1 Dirección2 Ciudad Código postal
La tabla de personas en el destino es una tabla base (que luego será heredada por la nueva tabla de clientes). Así que estoy tratando de exportar una fila de una tabla y completar 3 tablas en el destino.
Logré hacer esto de la siguiente manera:
- Obtener registros de la tabla fuente (Cliente)
- Crear un campo AddressId vacío
- Rellene la tabla de direcciones mediante la tarea de comando OLE DB (llama al procedimiento almacenado que devuelve SCOPE_IDENTITY () que está mapeado en el campo AddressId)
- Repita el paso 3 para rellenar la tabla Person (y recuperar PersonId
- Llene la tabla de referencia cruzada PersonAddress usando los campos PersonId y AddressId
La captura de pantalla de este paquete está debajo.
El mayor problema con este enfoque es que la tarea del comando OLE DB está insertando fila por fila y hace que todo el paquete sea extremadamente lento. ¿Es posible lograr lo mismo pero usando carga rápida?
Puedo hacerlo usando la tarea de comando OLE DB que llama al procedimiento almacenado y luego