Sql-Server
如何在使用而不是觸發器時插入最後一個標識行
當我使用而不是觸發器插入表時,
@@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;
順便說一句,您永遠不應該使用
@@IDENTITY
或IDENT_CURRENT()
無論如何。並且SCOPE_IDENTITY
應該保留用於您知道只能插入一行的情況。對觸發器的一個常見誤解是它們按行觸發,就像在其他平台中一樣,但在 SQL Server 中,它們按操作觸發 - 所以多行插入使用VALUES(),(),()
orINSERT...SELECT
-SCOPE_IDENTITY
您將設置哪個變數?