SQL SERVER 2000における識別値フェッチ関数 SQL Server 2000では、識別列はIDENTITYによって定義され、以下は最後に挿入されたレコードの識別値を取得することに関連しています
オフの関数の例
SQL Serverでは、SCOPE_IDENTITY()、@@IDENTITY、IDENT_CURRENT()を使って最後に挿入されたレコードの値を取得できます。これらの差は次の通りです: SCOPE_IDENTITY()は同じスコープ内のIDENTITY列に挿入された最後のIDENTITY値を返します。 スコープはモジュールであり、ストアドプロシージャ、トリガー、関数のことです
番号かバッチか。 したがって、2つの文が同じストアドプロシージャ、関数、またはバッチ内にある場合、同じスコープに属します。 @@IDENTITY 現在のセッション内のすべてのテーブルで生成された最後の識別値を返します IDENT_CURRENT()は、任意のセッションおよびスコープにおいて指定されたテーブルに対して生成された最後の識別値を返します 彼らの違いを示す例を挙げます
-- a) サンプルコード -- =========================================== -- テストテーブルを作成する -- =========================================== USE tempdb 行け
CREATE table t1(id int IDENTITY,col int) 挿入 t1 選択 1 ユニオン オールセレクト 2 CREATE table t2(id int IDENTITY,col int) 行け
T2でトリガー TR_insert_t2を作成 挿入用 AS 挿入 t1 セレクト 3 行け
-- =========================================== -- 3つの関数のテスト: 1 -- =========================================== T2値(1) SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY、 [IDENT_CURRENT() for t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() for t2] =IDENT_CURRENT(N't2')
/*--結果 SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() t1 に対して IDENT_CURRENT() t2 に対して ------------------ ------------ -------------------------- ----------------------- 1 3 3 1
(影響を受ける行数は1行です) --*/ 行け
-- =========================================== -- 3つの関数のテスト: 2 -- =========================================== T1値(10)を挿入してください SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY、 [IDENT_CURRENT() for t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() for t2] =IDENT_CURRENT(N't2')
/*--結果 SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() t1 に対して IDENT_CURRENT() t2 に対して ------------------ ------------ -------------------------- ----------------------- 4 4 4 1
(影響を受ける行数は1行です) --*/ 行け
-- =========================================== -- 3つの関数のテスト: 3 -- ** 新しい接続を開き、以下のコードを実行してください ** -- =========================================== SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY、 [IDENT_CURRENT() for t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() for t2] =IDENT_CURRENT(N't2')
/*--結果 SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() t1 に対して IDENT_CURRENT() t2 に対して ------------------ ------------ -------------------------- ----------------------- ヌル ヌル 4 & n
--=========================================== -- テスト環境を削除してください -- =========================================== テーブルT1、T2をドロップする
-- b) コード結果の記述 上記のコードからもわかるように: IDENT_CURRENT()は常に指定されたテーブルに挿入された最後に識別された値を返します @@IDENTITY 同じスコープかどうかにかかわらず、現在のセッションの同一値を返します。テスト1および2では、トリガーに挿入されたレコードの識別値を返すことがわかり、
テスト3では、現在のセッションに挿入レコードがないためNULLが返されます SCOPE_IDENTITY()は現在のセッションと同じスコープの識別値を返すため、テスト1、2ではトリガーの影響を受けない値を返し、テスト3では現在のセッションが補間されていないため
レコードを返すため、NULLを返します
|