带有Identity INSERT的T-SQL MERGE语句

时间:2015-08-11 21:22:56

标签: sql-server-2008 tsql

编写我的第一个MERGE语句并使用INSERT部分更新具有标识列的表

我的T-SQL结尾返回@@ IDENTITY(或者我可以返回SCOPE_IDENTITY())。

但是,如果触发了UPDATE部分,则返回的值必须为null并在客户端上引发错误。

我"修复"做SELECT ISNULL(@@ IDENTITY,-99999) - 伪造价值。

是否有更好的方法在INSERT上返回@@ IDENTITY但在UPDATE上返回其他一些值?

1 个答案:

答案 0 :(得分:0)

我必须先解释一下OUTPUT条款,这就是我所做的。我在最后添加了一个返回值,因此您可以返回此插入的最大标识。

以下是如何捕获合并插入的最大标识的示例。

--schema
CREATE TABLE #data
(
  id INT IDENTITY(1, 1)
         PRIMARY KEY
, Name VARCHAR(15) UNIQUE
, SomethingToUpdate INT NOT NULL
                        DEFAULT 1
)
--specimen data
INSERT  INTO #data
        ( Name )
VALUES  ( 'Andy' ),( 'Ben' ),( 'Charles' ),( 'Dave' ),( 'Elle' )
    --  ,( 'Zeb' ),( 'Xavier' ),( 'Yan' )


DECLARE @results TABLE
( id INT
, action nvarchar(10))

MERGE #data data
USING (
VALUES
    ( 'Zeb' ),
    ( 'Xavier' ),
    ( 'Yan' ),
    ( 'Dave' ),
    ('Ben')
) merger ( Name )
ON data.Name = merger.Name
WHEN MATCHED THEN
    UPDATE SET data.SomethingToUpdate = data.SomethingToUpdate + 1
WHEN NOT MATCHED BY TARGET THEN
    INSERT ( Name )
    VALUES ( merger.Name )
WHEN NOT MATCHED BY SOURCE THEN
    DELETE
OUTPUT ISNULL(Inserted.id,Deleted.id), $action  INTO @results
;

DECLARE @returnValue NUMERIC(18,0)

SELECT @returnValue = MAX(id) FROM @results WHERE action = 'INSERT'

PRINT @returnValue
--RETURN @returnValue