适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
IDENT_CURRENT系统函数返回为指定表或视图生成的最后一个身份值。 所生成的最后一个标识值可以针对任何会话和任何作用域。
语法
IDENT_CURRENT( 'table_or_view' )
参数
table_or_view
返回其身份值的表或视图名称。 table_or_view 是 varchar,无默认值。
返回类型
numeric(@@MAXPRECISION,0))
例外
返回 NULL 错误或调用方没有查看对象的权限。
在 SQL Server 中,用户只能查看其拥有的安全对象的元数据,或者已对其授予权限的安全对象的元数据。 这意味着如果用户对对象没有权限,像这样的 IDENT_CURRENT 元数据输出函数可以返回 NULL 。 有关详细信息,请参阅 Metadata Visibility Configuration。
备注
IDENT_CURRENT与SQL Server 2000(8.x)的身份函数SCOPE_IDENTITY相似,且@@IDENTITY。 这三个函数都返回最后生成的标识值。 但是,上述每个函数中定义的“最后”的作用域和会话有所不同:
-
IDENT_CURRENT返回在任何会话和作用域中为特定表生成的最后一个身份值。 -
@@IDENTITY返回当前会话中任意表在所有作用域中生成的最后身份值。 -
SCOPE_IDENTITY返回当前会话中任意表生成的最后身份值和当前作用域。
当值 IDENT_CURRENT 为( NULL 因为表从未包含过行或被截断)时, IDENT_CURRENT 函数返回种子值。
如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。 即使未提交试图向表中插入值的事务,也永远无法回滚标识值。 例如,如果 INSERT 语句因 IGNORE_DUP_KEY 冲突而失败,则表的当前标识值仍递增。
当在包含连接的视图上使用 IDENT_CURRENT 时, NULL 返回了。 这与是只有一个还是有多个联接表有标识列无关。
重要
在预测 IDENT_CURRENT 下一个生成的身份值时请谨慎。 实际生成的值可能与 IDENT_CURRENT 加 IDENT_INCR 值不同,因为其他会话的插入。
IDENT_CURRENT该函数在Fabric Data Warehouse中不可用于单位列。
示例
A. 返回指定表生成的最后一个身份值
以下示例返回为 Person.Address 数据库中的 AdventureWorks2025 表生成的最后一个标识值。
USE AdventureWorks2022;
GO
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
GO
B. 比较IDENT_CURRENT、@@IDENTITY 和SCOPE_IDENTITY返回的身份值
以下示例将显示由 IDENT_CURRENT、@@IDENTITY 和 SCOPE_IDENTITY 返回的不同标识值。
USE AdventureWorks2022;
GO
IF OBJECT_ID(N't6', N'U') IS NOT NULL
DROP TABLE t6;
GO
IF OBJECT_ID(N't7', N'U') IS NOT NULL
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 id FROM t6;
--IDs empty.
SELECT id FROM t7;
--ID is empty.
--Do the following in Session 1
INSERT t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Returns the value 100. This was inserted by the trigger.*/
SELECT SCOPE_IDENTITY();
/* Returns the value 1. This was inserted by the
INSERT statement two statements before this query.*/
SELECT IDENT_CURRENT('t7');
/* Returns value inserted into t7, that is in the trigger.*/
SELECT IDENT_CURRENT('t6');
/* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/
-- Do the following in Session 2.
SELECT @@IDENTITY;
/* Returns NULL because there has been no INSERT action
up to this point in this session.*/
SELECT SCOPE_IDENTITY();
/* Returns NULL because there has been no INSERT action
up to this point in this scope in this session.*/
SELECT IDENT_CURRENT('t7');
/* Returns the last value inserted into t7.*/