Sql-Server

如何在使用而不是觸發器時插入最後一個標識行

  • January 9, 2018

當我使用而不是觸發器插入表時,@@Identity,IDENT_CURRENT('Table')SCOPE_IDENTITY()返回 null。如何獲得插入行的最後一個身份?

使用 INSTEAD_OF 觸發器意味著尚未發生插入。您無法知道身份,因為它尚未生成。DBCC CHECKIDENT從元數據中偷取值是可能的(

INSTEAD_OF 觸發器極少需要,而且程式碼味道很重。你確定你需要它嗎?您不能使用正常的 AFTER 觸發器來完成這項工作嗎?

在您的而不是觸發器中,您絕對可以獲得插入的值……但直到您執行插入之後。

USE tempdb;
GO

CREATE TABLE dbo.SmellThis
(
 id INT IDENTITY(1,1),
 name VARCHAR(32)
);
GO

CREATE TRIGGER dbo.SmellThis_First
ON dbo.SmellThis
INSTEAD OF INSERT
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE @ids TABLE(id INT);

   IF NOT EXISTS 
   (
     SELECT 1 FROM sys.objects AS o
       INNER JOIN inserted AS i
       ON o.name = i.name
   )
   INSERT dbo.SmellThis(name)  
     OUTPUT inserted.id INTO @ids
     SELECT name 
     FROM inserted;

   SELECT id FROM @ids;
END
GO

INSERT dbo.SmellThis(name) SELECT 'Remus';
GO

結果:

id
----
1

現在清理:

DROP TABLE dbo.SmellThis;

順便說一句,您永遠不應該使用@@IDENTITYIDENT_CURRENT()無論如何。並且SCOPE_IDENTITY應該保留用於您知道只能插入一行的情況。對觸發器的一個常見誤解是它們按行觸發,就像在其他平台中一樣,但在 SQL Server 中,它們按操作觸發 - 所以多行插入使用VALUES(),(),()or INSERT...SELECT-SCOPE_IDENTITY您將設置哪個變數?

引用自:https://dba.stackexchange.com/questions/18877