2013-04-05 69 views
2

我使用SQL Server 2008和merge into从表值参数得到我的数据。合并到和SCOPE_IDENTITY问题

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从我insert语句获取的ID。

所以我的第一个更新和插入的作品,但我如何得到我的第二个插入插入的ID?

+0

@Richard固定的...... – NoviceDeveloper 2013-04-05 01:12:34

+0

我要迂腐约2两件事:1 MERGE不适[标签:SQL服务器2005年。 2.如果您还有其他问题,请随时再提问 - 这样做没有任何费用。欢迎来到StackOverflow! (我已经更新。但是我的回答) – RichardTheKiwi 2013-04-05 01:48:51

+0

真的有人下来投票呢? – NoviceDeveloper 2013-04-05 12:05:04

回答

3

这表明如何从MERGE语句记录输出数据。请注意,OUTPUT子句在MERGE中的所有分支上运行,包括UPDATE和INSERT部分。然后使用inserted.id和deleted.id之间的不匹配来确定实际插入的内容。 OUTPUT子句展示了如何发扬从inserted虚拟表name列。

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

我可以有也只是增加了一个'WHERE NOT EXISTS'从表变量插入但得到绝对病拔牙的。 – 2013-04-05 01:26:55