@@IDENTITY,SCOPE_IDENTITY,IDENT_CURRENT,吉祥3宝
总结:
日常开发个人常用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