IDENT_CURRENT (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

傳回針對指定之資料表或檢視表所產生的最後一個識別值。 最後一個識別值可能是針對任何工作階段和任何範圍所產生的。

Transact-SQL 語法慣例

Syntax

IDENT_CURRENT( 'table_or_view' )  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

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。 三個函數都會傳回最後產生的識別值。 不過,各函式定義 last 的範圍和工作階段各不相同:

  • IDENT_CURRENT 會傳回在任何工作階段和任何範圍中,產生給特定資料表的最後一個識別值。
  • @@IDENTITY 會傳回所有範圍的目前工作階段中,任何資料表所產生的最後一個識別值。
  • SCOPE_IDENTITY 會傳回在目前工作階段以及目前範圍中,任何資料表產生的最後一個識別值。

當 IDENT_CURRENT 值為 NULL (因為資料表從未包含過資料列或是已遭到截斷) 時,IDENT_CURRENT 函數會傳回初始值。

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

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

重要

使用 IDENT_CURRENT 預測下一個產生的識別值時請小心。 因為有其他工作階段所執行的插入,所以實際產生的值可能與 IDENT_CURRENT 加 IDENT_INCR 不同。

範例

A. 傳回為指定資料表產生的最後一個識別值

下列範例會傳回為 Person.Address 資料庫中 AdventureWorks2022 資料表產生的最後識別值。

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.*/  

另請參閱

@@IDENTITY (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
IDENT_INCR (Transact-SQL)
IDENT_SEED (Transact-SQL)
運算式 (Transact-SQL)
系統函數 (Transact-SQL)