2012-01-14 48 views
6

我想INSERT多堆行(使用INSERT SELECT)和OUTPUT所有的新舊ID變成一個「映射」表。INSERT多行和OUTPUT原始(源)值

如何獲取OUTPUT子句中的原始 ID(或任何源值)?我沒有辦法在那裏獲得任何源代碼值。

這裏是一個最小的代碼示例:

-- 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 

我的實際情況比較複雜,因此,例如我不能爲了保存一個「原始ID」臨時創建的數據表中的臨時列,我無法通過「ID」列以外的任何內容來唯一標識項目。

+3

[羞恥你是不是在2008年(http://stackoverflow.com/questions/5365629/using-merge-output-to -get-映射源間-ID-和目標-ID) – 2012-01-14 14:25:42

回答

2

有趣的問題。舉個例子,一個可能的作弊是取決於你將行數加倍的事實。假設行不會被刪除和[ID]列仍然密集:

-- 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