- 2006年9月 6日 12:35
- データベース
IDENTITY(自動インクリメント)なフィールドを使っていると、当然出てくるのがIDENTITY値の取得です。
局面としては、子テーブルにレコードを登録する際に親のID番号が必要になるとかそんな感じでしょうか。
くれぐれも、
SELECT MAX(ID) FROM HOGE
なんてしてはダメなんですよね。今登録したIDが最大値なんて保証は無いし、何より遅いし。
一番手っ取り早い方法が、@@IDENTITYを使う方法なんですが、使い方によっては問題もあるようですね。
@@IDENTITY クライシスを管理する
要約すると、@@IDENTITYを使った場合は、トリガーによってIDENTITY値が増えたときの値まで取れてしまうとのこと。
で、その解決方法としてSCOPE_IDENTITY() なんかがあるんですが、有効範囲とか微妙に分かりにくいので、分かりやすく解説されているページを探してみました。
[Landscape - エンジニアのメモ]IDENT_CURRENT / @@IDENTITY / SCOPE_IDENTITY の違い
SCOPE_IDENTITY()の場合、確かにトリガーの影響は受けないものの、有効範囲が非常に小さく(例えば同一ストアド内)使いにくいんですね。
具体的には、以下のような命令を纏めて実行するのは問題ないけど、バラバラに実行するとIDENTITY値はNULLとなってしまいます。
begin transaction;
insert into IDENTITY_TEST (name) values ('hoge');
select SCOPE_IDENTITY();
commit transaction;
※ INDENTITYフィールドとして、IDという列があると思ってください。
問題になりそうなところはトリガーの掛け方だと思うので、そこを注意すれば大した問題でもない気がしますが...
- Newer: 【Atlas】Atlasを使った未入力チェックのサンプル
- Older: 【Atlas】Atlasの使い方ビデオ
Comments:0
Trackbacks:0
- TrackBack URL for this entry
- http://magicbox.sakura.ne.jp/mt/mt-tb.cgi/143
- Listed below are links to weblogs that reference
- 【SQLServer】IDENTITY値の取得 from 爆裂!C#野郎