2012-01-14 13 views
6

INSERTマルチパッドの行(INSERT SELECTを使用)とOUTPUTすべての新しいIDと古いIDを「マッピング」テーブルに追加します。複数の行とOUTPUT元の(元の)値を挿入する

は、どのように私はOUTPUT句で ID(または任意のソース値)を得ることができますか?ソース値を取得する方法はありません。ここ

は、最小限のコードの例である:私は一時的に「元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」列以外のものでアイテムを一意に識別することはできません。

+3

[あなたが2008年ではありません恥](http://stackoverflow.com/questions/5365629/using-merge-output-to -get-mapping-source-idとtarget-idの間のマッピング) –

答えて

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