3

SQL Server 2008 を使用してmerge intoおり、テーブル値パラメーターからデータを取得しています。

 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  

私のステートメントscope_identityからIDを取得することは決してないと思います。insert

最初の更新と挿入は機能しますが、2 番目の挿入の挿入 ID を取得するにはどうすればよいですか?

4

1 に答える 1

3

これは、MERGE ステートメントからの OUTPUT データを記録する方法を示しています。OUTPUT 句は、UPDATE 部分と INSERT 部分の両方を含む、MERGE のすべての分岐にわたって実行されることに注意してください。次に、insert.id と deleted.id の不一致を使用して、実際に挿入されたものを特定します。OUTPUT 句は、仮想テーブルnameから列を繰り越す方法を示しています。inserted

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
于 2013-04-05T01:25:21.680 に答える