IDENT_CURRENT(Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Microsoft Fabric 中的 SQL 資料庫

IDENT_CURRENT系統函式會回傳指定資料表或視圖最後產生的身份值。 最後一個識別值可能是針對任何工作階段和任何範圍所產生的。

Transact-SQL 語法慣例

語法

IDENT_CURRENT( 'table_or_view' )

引數

table_or_view

回傳其身份值的表格或視圖名稱。 table_or_view 是沒有預設值的 varchar

傳回類型

numeric(@@MAXPRECISION,0))

例外狀況

發生錯誤或呼叫端沒有檢視物件的許可權時傳回 NULL

在 SQL Server 中,使用者只能檢視使用者擁有或被授與某些權限之安全性實體的中繼資料。 這表示如果使用者對物件沒有任何權限,會回傳NULL像是IDENT_CURRENT中繼資料的內建函式。 如需相關資訊,請參閱 Metadata Visibility Configuration

備註

IDENT_CURRENT與 SQL Server 2000(8.x)的身份函式SCOPE_IDENTITY相似,且 @@IDENTITY。 三個函數都會傳回最後產生的識別值。 不過,各函式定義 last 的範圍和工作階段各不相同:

  • IDENT_CURRENT 回傳在任何會話及任何作用域中,特定資料表產生的最後身份值。
  • @@IDENTITY 回傳目前會話中任一資料表在所有作用域中產生的最後身份值。
  • SCOPE_IDENTITY 回傳目前會話中任一資料表及當前作用域所產生的最後身份值。

當值 IDENT_CURRENT 為( NULL 因為資料表從未包含過列或被截斷)時,函 IDENT_CURRENT 式會回傳種子值。

失敗的陳述式和交易可能會變更資料表的目前識別,以及建立識別欄位值中的間距。 識別值永遠不會回復,即使試圖將值插入資料表的交易未獲認可,也是如此。 例如,如果某 INSERT 個語句因 IGNORE_DUP_KEY 違規而失敗,該表格目前的身份值仍然會被增加。

當在包含 join 的視圖上使用 IDENT_CURRENT 時, NULL 回傳 。 這是因為只有一或多個聯結資料表具有識別欄位。

重要

在預測 IDENT_CURRENT 下一個產生的身份值時請謹慎。 實際產生的值可能與 IDENT_CURRENTIDENT_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@@IDENTITYSCOPE_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.*/