Reputation: 1290
I am using SQL Server 2008 and merge into
to get my data from a table-valued parameter.
CREATE PROCEDURE [dbo].[SP1]
(
@p as TTVP readonly
)
AS
declare @ThisId int
Begin
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());
seclect @ThisId = identity_scope()
insert into SECONDTABLE (ID, myDATE)
select (@ThisId, Getdate())
END
I think my scope_identity
never gets the ID from my insert
statement.
So my first update and insert works, but how do I get the inserted ID for my second insert?
Upvotes: 3
Views: 2369
Reputation: 107776
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
Upvotes: 3