在您触发而不是触发器中,您肯定可以获取插入的值……但是直到执行插入操作之后,您才可以获取。
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(),(),()
或进行多行插入INSERT...SELECT
- SCOPE_IDENTITY
您将为变量设置哪个?
inserted
,但没有行插入的时候INSTEAD OF
触发触发器。