一、@@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

 

版权声明:本文为rose0705原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/rose0705/articles/6627697.html