Domanda

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?

È stato utile?

Soluzione

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top