ВСТАВИТЬ несколько строк и ВЫХОДНЫЕ исходные (исходные) значения - PullRequest
6 голосов
/ 14 января 2012

Я бы хотел INSERT несколько строк (используя INSERT SELECT) и OUTPUT все новые и старые идентификаторы в таблицу "отображения".

Как я могу получить оригинальный идентификатор (или любые исходные значения) в предложении OUTPUT?Я не вижу способа получить какие-либо исходные значения там.

Вот минимальный пример кода:

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

1 Ответ

2 голосов
/ 15 января 2012

Интересный вопрос.Для вашего примера возможный чит должен зависеть от того, что вы удваиваете количество строк.Предполагая, что строки никогда не удаляются, а столбец [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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...