INSERT多行和OUTPUT原始(源)值

时间:2012-01-14 14:17:52

标签: sql sql-server-2005 tsql

我希望将INSERT多个行(使用INSERT SELECT)和OUTPUT所有新旧ID分配到“映射”表中。

如何在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”列以外的任何其他方式唯一标识项目。

1 个答案:

答案 0 :(得分: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