区分 @@IDENTITY,SCOPE_IDENTITY,IDENT_CURRENT

总结:
  日常开发个人常用SCOPE_IDENTITY(),因为SCOPE只在当前的作用域返回值.
  实际应用中应根据3个函数作用而定.

 

定义:
@@IDENTITY
返回最后插入的标识值的系统函数。

SELECT @@IDENTITY as 'IDENTITY';

 

IDENT_CURRENT

返回为某个会话和作用域中指定的表或视图生成的最新的标识值。

SELECT IDENT_CURRENT('表名') as 'IDENT_CURRENT';

 

SCOPE_IDENTITY

返回插入到同一作用域中的标识列内的最后一个标识值。一个范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

SELECT SCOPE_IDENTITY() as 'SCOPE_IDENTITY';

 

区别:

SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 可以返回任何会话和任何作用域中为特定表生成的标识值。

 

备注:

@@IDENTITY 返回最后生成的标识值。如果语句触发了一个或多个触发器,该触发器又执行了生成标识值的插入操作,那么,在语句执行后立即调用 @@IDENTITY 将返回触发器生成的最后一个标识值。如果对包含标识列的表执行插入操作后触发了触发器,并且触发器对另一个没有标识列的表执行了插入操作,则 @@IDENTITY 将返回第一次插入的标识值。

 

事例:

GO

IF EXISTS( SELECT * FROM Admin_User)
BEGIN
  DROP TABLE  Admin_User;
END

IF EXISTS( SELECT * FROM Test_Table)
BEGIN
  DROP TABLE  Test_Table;
END

GO
CREATE TABLE Admin_User
(
    Account_ID                    int IDENTITY(1,1) not null,             -- 用户ID
    Login_Account                 nvarchar(30) not null,                  -- 用户帐号
    Constraint PK_Admin_User Primary key(Account_ID)
);

GO
CREATE TABLE Test_Table
(
    Test_ID                       int IDENTITY(100,1) not null,           -- 测试ID
    Constraint PK_Test_Table Primary key(Test_ID)
);

GO
--创建触发器
CREATE TRIGGER tigerAdmin_User_INSERT ON Admin_User FOR INSERT
AS
BEGIN
   INSERT Test_Table DEFAULT VALUES
END;
GO

--插入数据
INSERT Admin_User(
        Login_Account                           -- 用户帐号
        )
VALUES(
        'techtjh'                          -- 用户帐号
        );

SELECT @@IDENTITY as 'IDENTITY';

SELECT SCOPE_IDENTITY() as 'SCOPE_IDENTITY()';

SELECT IDENT_CURRENT('Test_Table') as 'IDENT_CURRENT(Test_Table)';

SELECT IDENT_CURRENT('Admin_User') as 'IDENT_CURRENT(Admin_User)';

--则执行结果为 100,1,100,1

--新打开查询窗口 执行以下代码

SELECT @@IDENTITY as 'IDENTITY';

SELECT SCOPE_IDENTITY() as 'SCOPE_IDENTITY()';;

SELECT IDENT_CURRENT('Test_Table') as 'IDENT_CURRENT(Test_Table)';

SELECT IDENT_CURRENT('Admin_User') as 'IDENT_CURRENT(Admin_User)';

--则执行结果为 NULL,NULL,100,1


你可能感兴趣的:(区分 @@IDENTITY,SCOPE_IDENTITY,IDENT_CURRENT)