2012-01-14 5 views
6

Tôi muốn INSERT hàng nhiều hàng (sử dụng INSERT SELECT) và OUTPUT tất cả ID mới và cũ thành bảng "ánh xạ".INSERT nhiều hàng và OUTPUT giá trị ban đầu (nguồn)

Làm cách nào để nhận được ID gốc (hoặc bất kỳ giá trị nguồn nào) trong mệnh đề OUTPUT? Tôi không thấy cách nào nhận được bất kỳ giá trị nguồn nào ở đó.

Đây là một ví dụ mã tối thiểu:

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

kịch bản thực tế của tôi là phức tạp hơn, ví dụ như vậy tôi không thể tạo ra một cột tạm thời trên bảng dữ liệu để lưu trữ một "ID gốc" tạm thời, và Tôi không thể xác định duy nhất các mục bằng bất kỳ mục nào khác ngoài cột 'ID'.

+3

[xấu hổ bạn không phải trên 2008] (http://stackoverflow.com/questions/5365629/using-merge-output-to -get-mapping-between-source-id-và-target-id) –

Trả lời

2

Câu hỏi thú vị. Ví dụ của bạn, một cheat có thể là phụ thuộc vào thực tế là bạn đang tăng gấp đôi số hàng. Giả sử hàng không bao giờ bị xóa và [id] cột vẫn dày đặc:

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