@@IDENTITY、SCOPE_IDENTITY() 和 OUTPUT
一、@@IDENTITY
返回最后插入的标识值的系统函数。
https://msdn.microsoft.com/zh-cn/library/ms187342.aspx
完成后插入、 SELECT INTO 或大容量复制语句,@@IDENTITY包含语句生成的最后一个标识值。
如果语句未影响任何表与标识列,@IDENTITY返回 NULL。
如果插入多个行时,生成多个标识值,@IDENTITY返回生成的最后一个标识值。
如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。
即使未提交试图向表中插入值的事务,也永远无法回滚标识值。
例如,如果因 IGNORE_DUP_KEY 冲突而导致 INSERT 语句失败,表的当前标识值仍然会增加。
@@IDENTITY,SCOPE_IDENTITY 和 IDENT_CURRENT 是类似的功能,因为它们都返回插入到标识列的表的最后一个值。
@@IDENTITY和 SCOPE_IDENTITY 返回在当前会话中任何表中生成的最后一个标识值。
但是,SCOPE_IDENTITY 返回的值仅在当前作用域;
@@IDENTITY并不局限于特定的作用域。
IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。
IDENT_CURRENT 可以返回任何会话和任何作用域中为特定表生成的标识值。
复制可能会影响 @@IDENTITY值,因为它正在使用中的复制触发器和存储的过程。
@@IDENTITY不是最新的用户创建标识的可靠指示器,如果列是复制项目的一部分。
你可以使用 SCOPE_IDENTITY() 函数的语法而不是 @@IDENTITY。
二、SCOPE_IDENTITY
返回插入到同一作用域中的标识列内的最后一个标识值。 一个范围是一个模块:存储过程、触发器、函数或批处理。
因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。
https://msdn.microsoft.com/zh-cn/library/ms190315.aspx
--清空数据 TRUNCATE TABLE dbo.TUsers
--窗口1 SELECT @@SPID AS \'SPID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\' INSERT INTO dbo.TUsers (FName,FAddTime,FSessionID) VALUES (\'test1\',GETDATE(),@@SPID) SELECT @@SPID AS \'SPID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\'
--窗口2 SELECT @@SPID AS \'SPID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\' INSERT INTO dbo.TUsers (FName,FAddTime,FSessionID) VALUES (\'test2\',GETDATE(),@@SPID) SELECT @@SPID AS \'SPID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\'
1-2
1-2
SELECT FID,FName,FSessionID,FAddTime
FROM dbo.TUsers
--窗口3 DECLARE @outTable TABLE ( thisID INT ) DECLARE @lastID INT SELECT @@SPID AS \'SPID\', @lastID AS \'lastID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\' INSERT INTO dbo.TUsers (FName,FAddTime,FSessionID) OUTPUT Inserted.FID INTO @outTable --chuchucharudexinzhi VALUES (\'output test\',GETDATE(),@@SPID) SELECT TOP(1) @lastID=thisID FROM @outTable ORDER BY thisID DESC SELECT @@SPID AS \'SPID\', @lastID AS \'lastID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\' SELECT * FROM @outTable
--窗口4 DECLARE @outTable TABLE ( thisID INT ) DECLARE @lastID INT SELECT @@SPID AS \'SPID\', @lastID AS \'lastID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\' INSERT INTO dbo.TUsers (FName,FAddTime,FSessionID) OUTPUT Inserted.FID INTO @outTable --shuchucharudexinzhi VALUES (\'output test2\',GETDATE(),@@SPID) SELECT TOP(1) @lastID=thisID FROM @outTable ORDER BY thisID DESC SELECT @@SPID AS \'SPID\', @lastID AS \'lastID\', @@IDENTITY AS \'IDENTITY\', SCOPE_IDENTITY() AS \'SCOPE_IDENTITY\' SELECT * FROM @outTable
3
3
4
SELECT FID,FName,FSessionID,FAddTime
FROM dbo.TUsers