SELECT SCOPE_IDENTITY()
att använda @@IDENTITY kan få oväntade resultat, så var försiktig med hur du använder den. Utlösare som infogar poster i andra tabeller kommer att göra att @@IDENTITY-värdet ändras - där SCOPE_IDENTITY() ger dig den sista identiteten från endast ditt nuvarande omfång.
Här är ett exempel som visar skillnaden mellan @@IDENTITY och SCOPE_INSERT() och hur de kan returnera olika värden.
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
Ett annat alternativ som ingen har diskuterat här är att använda OUTPUT-satsen som finns i SQL 2005. I det här fallet skulle du bara behöva lägga till output-satsen i din infogning och sedan fånga upp den postmängden från din kod. Detta fungerar bra när du infogar flera poster istället för bara en...
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;