IDENT_CURRENT (Transact-SQL)
指定されたテーブルまたはビューに対して生成された最新の ID 値を返します。 最新の ID 値は、任意のセッションおよびスコープに対して生成されることがあります。
構文
IDENT_CURRENT( 'table_name' )
引数
- table_name
ID 値が返されるテーブルの名前を指定します。 table_name のデータ型は varchar で、既定値はありません。
戻り値の型
numeric(38,0)
例外
エラーが発生した場合、または呼び出し元にオブジェクトの表示権限がない場合は、NULL が返されます。
SQL Server では、そのユーザーが所有しているか、または権限を与えられている、セキュリティ保護可能なアイテムのメタデータのみを表示できます。 つまり、オブジェクトに対する権限がユーザーに与えられていない場合、メタデータを生成する組み込み関数 (IDENT_CURRENT など) が NULL を返す可能性があります。 詳細については、「メタデータ表示の構成」を参照してください。
説明
IDENT_CURRENT は、SQL Server 2000 の ID 関数 SCOPE_IDENTITY および @@IDENTITY に似ています。 3 つの関数とも、最後に生成された ID 値を返します。 ただし、各関数の中で、最後が定義されるスコープとセッションがそれぞれ異なります。
IDENT_CURRENT は、任意のセッションおよび任意のスコープ内の特定のテーブルに対して生成された最後の ID 値を返します。
@@IDENTITY は、すべてのスコープを対象に、現在のセッション内の任意のテーブルに対して生成された最後の ID 値を返します。
SCOPE_IDENTITY は、現在のセッションと現在のスコープ内の任意のテーブルに対して生成された最後の ID 値を返します。
IDENT_CURRENT 値が NULL の場合 (テーブルに行が格納されたことがないか、テーブルで切り捨てが行われたため)、IDENT_CURRENT 関数はシード値を返します。
失敗したステートメントやトランザクションにより、テーブルの現在の ID が変更され、ID 列の値にギャップが生じることがあります。 ID 値がロールバックされることはありません。これは、テーブルに値を挿入するトランザクションがコミットされない場合でも同じです。 たとえば、IGNORE_DUP_KEY 違反によって INSERT ステートメントが失敗した場合でも、テーブルの現在の ID 値は増分されます。
次に生成される ID 値の予測に IDENT_CURRENT を使用する場合は注意してください。 実際に生成される値は、他のセッションで実行される挿入操作が原因で、IDENT_CURRENT と IDENT_INCR の合計値とは異なる場合があります。
使用例
A. 指定したテーブルに対して生成された最新の ID 値を返す
次の例では、AdventureWorks2012 データベースの Person.Address テーブルに対して生成された最新の ID 値を返します。
USE AdventureWorks2012;
GO
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
GO
B. IDENT_CURRENT、@@IDENTITY、および SCOPE_IDENTITY により返された ID 値を比較する
次の例では、IDENT_CURRENT、@@IDENTITY、および SCOPE_IDENTITY によって返される異なる ID 値を示しています。
USE AdventureWorks2012;
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.*/