SELECT SCOPE_IDENTITY()
@@ IDENTITYを使用すると予期しない結果が生じる可能性があるため、使用方法に注意してください。レコードを他のテーブルに挿入するトリガーにより、@@ IDENTITY値が変更されます。SCOPE_IDENTITY()は、現在のスコープのみから最後のIDを提供します。
@@ IDENTITYとSCOPE_INSERT()の違いと、それらが異なる値を返す方法を示すサンプルを次に示します。
use tempdb
go
create table table1
(ID int identity)
go
create table table2
(ID int identity(100, 1))
go
create trigger temptrig
on table1
for insert
as
begin
insert table2
default values;
end
go
insert table1
default values;
select SCOPE_IDENTITY(),
@@IDENTITY
ここで誰も議論していないもう1つのオプションは、SQL 2005にあるOUTPUT句を使用することです。この場合、出力句を挿入に追加し、コードからそのレコードセットをキャッチする必要があります。これは、1つだけではなく複数のレコードを挿入する場合にうまく機能します...
use tempdb
go
create table table1
(ID int identity)
go
insert table1
output inserted.ID
default values;
--OR...
insert table1
output inserted.$identity
default values;