IDEN_CURRENT相关问题

IDENT_CURRENT
返回为任何会话和任何作用域中的指定表最后生成的标识值。

语法
IDENT_CURRENT(
'table_name')

参数
table_name

是将要返回其标识值的表的名称。table_name 的数据类型为
varchar,没有默认值。

返回类型
sql_variant

注释
IDENT_CURRENT 类似于 Microsoft® SQL Server™
2000 标识函数 SCOPE_IDENTITY@@IDENTITY。这三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。


@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。


SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
示例
下面的示例说明由 IDENT_CURRENT、
@@IDENTITYSCOPE_IDENTITY 返回的不同的标识值。

USE pubs
DROP TABLE t6
DROP TABLE t7
GO
CREATE TABLE t6(id int IDENTITY)
CREATE TABLE t7(id int IDENTITY(100,1))
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
  
INSERT t7 DEFAULT VALUES
END
GO
--end of trigger definition

SELECT   * FROM t6
--id is empty.

SELECT   * FROM t7
--id is empty.

--Do the following in Session 1
INSERT t6 DEFAULT VALUES
SELECT @@IDENTITY     
/*Returns the value 100, which was inserted by the trigger.*/

SELECT SCOPE_IDENTITY()  
/* Returns the value 1, which was inserted by the
INSERT stmt 2 statements before this query.
*/

SELECT IDENT_CURRENT('t7')
/* Returns value inserted into t7, i.e. in the trigger.*/

SELECT IDENT_CURRENT('t6')
/* Returns value inserted into t6, which was the INSERT statement 4 stmts before this query.*/

-- Do the following in Session 2
SELECT @@IDENTITY
/* Returns NULL since there has been no INSERT action
so far in this session.
*/

SELECT SCOPE_IDENTITY()
/* Returns NULL since there has been no INSERT action
so far in this scope in this session.
*/

SELECT IDENT_CURRENT('t7')
/* Returns the last value inserted into t7.*/

总结:
  日常开发个人常用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

--本文摘自CSDN论坛

发布了12 篇原创文章 · 获赞 3 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览