2012-01-14 17 views
6

Me gustaría INSERT filas multiples (usando INSERT SELECT) y OUTPUT todos los ID nuevos y viejos en una tabla de "mapeo".INSERTAR filas múltiples y valores originales de salida (fuente)

¿Cómo puedo obtener el original ID (o cualquier valor de origen) en la cláusula OUTPUT? No veo una forma de obtener ningún valor fuente allí.

Aquí es un ejemplo de código mínima:

-- create some test data 
declare @t table (id int identity, name nvarchar(max)) 
insert @t ([name]) values ('item 1') 
insert @t ([name]) values ('another item') 

-- duplicate items, storing a mapping from src ID => dest ID 
declare @mapping table (srcid int, [newid] int) 

insert @t ([name]) 
output ?????, inserted.id into @mapping-- I want to use source.ID but it's unavailable here. 
select [name] from @t as source 

-- show results  
select * from @t 
select * from @mapping 

Mi escenario real es más complejo, así que por ejemplo no puedo crear una columna temp en la tabla de datos con el fin de almacenar un "ID originales" temporalmente, y No puedo identificar elementos de manera única por otra cosa que no sea la columna 'ID'.

+3

[pena que no está en 2008] (http://stackoverflow.com/questions/5365629/using-merge-output-to -get-mapping-between-source-id-and-target-id) –

Respuesta

2

Interesante pregunta. Para su ejemplo, un posible truco es depender del hecho de que está duplicando el número de filas. Suponiendo que las filas nunca se eliminan y la [id] sigue siendo la columna densa:

-- create some test data 
declare @t table (id int identity, name nvarchar(max)) 
insert @t ([name]) values ('item 1') 
insert @t ([name]) values ('another item') 

-- duplicate items, storing a mapping from src ID => dest ID 
declare @mapping table (srcid int, [newid] int) 

declare @Rows as Int = (select Count(42) from @t) 
insert @t ([name]) 
    output inserted.id - @Rows, inserted.id into @mapping 
    select [name] from @t as source order by source.id -- Note 'order by' clause. 

-- show results  
select * from @t 
select * from @mapping 
Cuestiones relacionadas