编写我的第一个MERGE语句并使用INSERT部分更新具有标识列的表
我的T-SQL结尾返回@@ IDENTITY(或者我可以返回SCOPE_IDENTITY())。
但是,如果触发了UPDATE部分,则返回的值必须为null并在客户端上引发错误。
我"修复"做SELECT ISNULL(@@ IDENTITY,-99999) - 伪造价值。
是否有更好的方法在INSERT上返回@@ IDENTITY但在UPDATE上返回其他一些值?
答案 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