我希望将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”列以外的任何其他方式唯一标识项目。
答案 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