SELECT SCOPE_IDENTITY()
używanie @@IDENTITY może przynieść nieoczekiwane rezultaty, więc uważaj, jak używasz tego. Wyzwalacze, które wstawiają rekordy do innych tabel, spowodują zmianę wartości @@IDENTITY — gdzie SCOPE_IDENTITY() da ci ostatnią tożsamość tylko z bieżącego zakresu.
Oto przykład, który pokaże różnicę między @@IDENTITY i SCOPE_INSERT() oraz sposób, w jaki mogą one zwracać różne wartości.
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
Inną opcją, o której nikt tutaj nie dyskutował, jest użycie klauzuli OUTPUT, która jest w SQL 2005. W takim przypadku wystarczy dodać klauzulę output do swojego inserta, a następnie przechwycić ten zestaw rekordów z kodu. Działa to dobrze podczas wstawiania wielu rekordów zamiast tylko 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;