IDENT_CURRENT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

指定されたテーブルまたはビューに対して生成された最新の ID 値を返します。 最新の ID 値は、任意のセッションおよびスコープに対して生成されることがあります。

Transact-SQL 構文表記規則

構文

IDENT_CURRENT( 'table_or_view' )  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

table_or_view
ID 値が返されるテーブルまたはビューの名前です。 table_or_viewvarchar で、既定値はありません。

戻り値の型

numeric(@@MAXPRECISION,0))

例外

エラーが発生した場合、または呼び出し元にオブジェクトの表示権限がない場合は、NULL が返されます。

SQL Server では、そのユーザーが所有している、または権限を与えられている、セキュリティ保護可能なアイテムのメタデータのみを表示できます。 つまり、オブジェクトに対する権限がユーザーに与えられていない場合、メタデータを生成する組み込み関数 (IDENT_CURRENT など) が NULL を返す可能性があります。 詳細については、「 Metadata Visibility Configuration」を参照してください。

解説

IDENT_CURRENT は、SQL Server 2000 (8.x) の ID 関数 SCOPE_IDENTITY および @@IDENTITY に似ています。 3 つの関数とも、最後に生成された ID 値を返します。 ただし、各関数の中で、last が定義されるスコープとセッションがそれぞれ異なります。

  • IDENT_CURRENT は、任意のセッションおよび任意のスコープ内の特定のテーブルに対して生成された最後の ID 値を返します。
  • @@IDENTITY は、すべてのスコープを対象に、現在のセッション内の任意のテーブルに対して生成された最後の ID 値を返します。
  • SCOPE_IDENTITY は、現在のセッションと現在のスコープ内の任意のテーブルに対して生成された最後の ID 値を返します。

IDENT_CURRENT 値が NULL の場合 (テーブルに行が格納されたことがないか、テーブルで切り捨てが行われたため)、IDENT_CURRENT 関数はシード値を返します。

失敗したステートメントとトランザクションによって、テーブルに対する現在の ID が変更され、ID 列値に差異が生じる可能性があります。 ID 値がロールバックされることはありません。これは、テーブルに値を挿入するトランザクションがコミットされない場合でも同じです。 たとえば、INSERT ステートメントが IGNORE_DUP_KEY 違反のために失敗しても、テーブルの現在の ID 値は増分されます。

結合を含むビュー上で IDENT_CURRENT を使用すると、NULL が返されます。 これは、1 つまたは複数の結合テーブルに ID 列があるかどうかには関係ありません。

重要

次に生成される ID 値の予測に IDENT_CURRENT を使用する場合は注意してください。 実際に生成される値は、他のセッションで実行される挿入操作が原因で、IDENT_CURRENT と IDENT_INCR の合計値とは異なる場合があります。

A. 指定したテーブルに対して生成された最新の ID 値を返す

次の例では、AdventureWorks2022 データベースの Person.Address テーブルに対して生成された最新の ID 値を返します。

USE AdventureWorks2022;  
GO  
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;  
GO  

B. IDENT_CURRENT、@@IDENTITY、および SCOPE_IDENTITY により返された ID 値を比較する

次の例では、IDENT_CURRENT@@IDENTITY、および SCOPE_IDENTITY によって返される異なる ID 値を示しています。

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)