SQL Serverを使って、挿入記録後のID(自動番号)を取得します。


最近開発プロジェクトの過程で問題になりました。記録を挿入したらすぐに所在データベースのIDを取得します。このIDは自己増加です。どうすればいいですか?sql server 2005にはいくつかの方法が実装されています。
このIDを取得する一番簡単な方法は、検索後にselect@indentityを作成することです。
--SQL文でデータベースとテーブルを作成します。

create database dbdemo
go
use dbdemo
go
create table tbldemo
(
    id int primary key identity(1,1),
    name varchar(20)
)
go
--下記のSQL文を実行すると、挿入レコードに対応する自増列の値が検出されます。
insert into tbldemo values('テスト')select@dentity
SQL Server 2000には、似たような機能が三つあります。SCOPE_IDENTITY、IDENT_CURRENTと@IDENTITYは、いずれもIDENTITY列に挿入された値を返します。
  1)IDENT_CURRENTは、任意のセッションおよび任意のスコープ内の特定のテーブルの最後に生成された識別値を返し、それは、スコープおよびセッションによって制限されず、指定されたテーブルに制限される。
  2)@IDENTITYは、現在のセッションのすべてのアクティブ領域のいずれかのテーブルの最後に生成された識別値を返します。
  3)SCOPE_IDENTITYは、現在のセッションおよび現在のスコープのいずれかのテーブルの最後に生成された識別値を返します。
SCOPE_IDENTITYと@@IDENTITYは、現在のセッションのいずれかのテーブルで生成された最後の識別値を返します。しかし、SCOPE_IDENTITYは現在のスコープに挿入された値だけを返します。@IDENTITYは特定の作用領域に限定されない。
例えば、2つのテーブルT 1とT 2があり、T 1にINSERTフリップフロップが定義されている。ある行をT 1に挿入すると、トリガーが励起され、T 2に1行が挿入される。この例は、2つの作用領域を示している。1つはT 1に挿入され、もう1つはフリップフロップの結果としてT 2に挿入される。
T 1とT 2はIDENTITY列があると仮定します。@IDENTITYとSCOPE_IDENTITYはT 1のINSERT文の最後に異なる値を返します。@IDENTITYは、挿入T 2の値である現在のセッションに挿入された任意のアクティブ領域の最後のIDENTITY列の値を返します。
SQL Serverは最後に記録を挿入した自動番号IDを返します。
最近開発プロジェクトの過程でこのような問題が発生しました。記録を挿入した直後に、データベースに自分で追加したIDを取得して、関連データを処理するにはどうすればいいですか?sql server 2000の中でこのようにすることができて、いくつかの方式があります。詳しくは以下の説明と比較を見てください。
一、このIDを取得するための最も簡単な方法は、(以下、簡単で実用的な例を挙げる)
--データベースとテーブルの作成
create database MyDataBase
use MyDataBase
create table mytable
(
id int identity(1,1)
name varhar(20)
)
--このSQLを実行すると、挿入レコードに対応する自増列の値が検出されます。
insert into mytable values('李四')
select@@identity
二、三種類の方式の比較
SQL Server 2000には、似たような三つの機能があります。彼らはそれぞれSCOPE_です。IDENTITY、IDENT_CURRENTと@IDENTITYは、いずれもIDENTITY列に挿入された値を返します。
IDENT_CURRENTは、任意のセッションおよび任意のスコープ内の特定のテーブルの最後に生成された識別値に戻る。IDENT_CURRENTは、スコープおよびセッションによって制限されず、指定されたテーブルに制限される。IDENT_CURRENTは、任意のセッションおよびスコープ内の特定のテーブルによって生成された値を返します。
@@IDENTITYは、現在のセッションのすべてのアクティブ領域のいずれかのテーブルの最後に生成された識別値を返します。
SCOPE_IDENTITYは、現在のセッションと現在のスコープのいずれかのテーブルの最後に生成された識別値を返します。
SCOPE_IDENTITYと@@IDENTITYは、現在のセッションのいずれかのテーブルで生成された最後の識別値を返します。しかし、SCOPE_IDENTITYは現在のスコープに挿入された値だけを返します。@IDENTITYは特定の作用領域に限定されない。
例えば、2つのテーブルT 1とT 2があり、T 1にINSERTフリップフロップが定義されている。ある行をT 1に挿入すると、トリガーが励起され、T 2に1行が挿入される。この例は、2つの作用領域を示している。1つはT 1に挿入され、もう1つはフリップフロップの結果としてT 2に挿入される。
T 1とT 2はIDENTITY列があると仮定します。@IDENTITYとSCOPE_IDENTITYは、T 1のINSERT文の最後に異なる値を返す。
@@IDENTITYは、T 2に挿入された値である現在のセッションに挿入された任意のアクティブ領域の最後のIDENTITY列の値を返します。
SCOPE_IDENTITY()は、同じ作用領域で発生する最後のINSERTである挿入T 1のIDENTITY値を返す。スコープに挿入文が表示される前にSCOPE_を起動するとIDENTITY()関数は、NULL値を返します。
IDENT_CURRENT('T 1')とIDENT_CURRENT('T 2')の戻り値は、それぞれこの2つのテーブルの最後の自己増加値である。
ajqcの実験:(40本のローカルスレッド、40+40本のリモートスレッドを同時にテストし、1200万行を挿入する)
1.典型的なカスケードアプリケーションでは、@@IDENTITYは使えません。CII 850,256 M SDのマシンで1 W以上行った時に、同時に衝突します。P 42.8 C、512 M DDRで、6000以上行った時に、同時に衝突します。
2.SCOPE_IDENTITY()は絶対的に信頼できています。記憶の中で使えます。トリガーも建設しなくて、コンフリクトしていません。
SELECT   IDENT_CURRENT('Table Name')   --指定テーブルで生成した最後の表示値を返します。  
SELECT   IDENT_INCR('Table Name')--指定テーブルの表示フィールドの増分値を返します。
SELECT   IDENT_SEED('Table Name')--指定テーブルの表示フィールドシード値を返します。
最後にレコードを挿入する自動番号を返します。
SELECT IDENT_CURRENT('Table Name')
次の自動番号を返します。  
SELECT   IDENT_CURRENT('Table Name')   +   (SELECT   IDENT_INCR('Table Name')
SELECT@@IDENTITY--現在のセッションのすべてのテーブルで生成された最後の表示値を返します。
以上はsql server 2000の場合についてですが、例えばmy sqlやoracleではどうやって実現されますか?どう処理しますか?私も模索中です。。。。この処理方法を知っている友達がいたら、教えを忘れずに共有しましょう。