This shows how to record OUTPUT data from the MERGE statement. Note that the OUTPUT clause runs across ALL the branches in the MERGE, including both the UPDATE and INSERT portions. It then uses the mismatch between inserted.id and deleted.id to work out what was actually inserted. The OUTPUT clause shows how you can carry forward the name
column from the inserted
virtual table.
use tempdb;
-- create the test tables and table type
create table dbo.FirstTable (
ID int identity primary key,
NAME sysname,
myDATE datetime);
GO
create table dbo.SecondTable (
ID int primary key,
myDATE datetime,
NAME sysname);
GO
create type TTVP as TABLE(ID int, NAME sysname);
GO
-- create the procedure
CREATE PROCEDURE dbo.SP1
@p as TTVP readonly
AS
SET NOCOUNT ON;
create table #cache (new_id int primary key, old_id int, name sysname);
merge into dbo.firsttable tp
using @p ps on tp.id = ps.id
when matched then
update
set tp.name = ps.name,
tp.mydate = getdate()
when not matched then
insert (name, mydate)
values (ps.name, getdate())
output inserted.id, deleted.id, inserted.name into #cache;
insert into dbo.secondtable (id, mydate, name)
select new_id, getdate(), name
from #cache
where old_id is null;
GO
-- set up some test data (2 rows)
truncate table dbo.FirstTable;
insert dbo.FirstTable values ('abc', getdate());
insert dbo.FirstTable values ('ghi', getdate()-1);
GO
-- execute the procedure
declare @p TTVP;
insert @p values (1, 'abc'),(2, 'xyz'),(3, 'def');
exec dbo.SP1 @p;
-- check the results
select * from dbo.firsttable
select * from dbo.secondtable