renglones referencias multiples filas fechas ejemplos cruzadas convertir consultas con columns columnas sql ssis identity cross-reference

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:

  1. Obtener registros de la tabla fuente (Cliente)
  2. Crear un campo AddressId vacío
  3. 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)
  4. Repita el paso 3 para rellenar la tabla Person (y recuperar PersonId
  5. 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