Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

ottenere un nuovo ID record SQL

SELECT SCOPE_IDENTITY() 

l'utilizzo di @@IDENTITY può avere risultati inaspettati, quindi fai attenzione a come lo usi. I trigger che inseriscono record in altre tabelle causeranno la modifica del valore @@IDENTITY, dove SCOPE_IDENTITY() ti darà l'ultima identità solo dal tuo ambito corrente.

Ecco un esempio che mostrerà la differenza tra @@IDENTITY e SCOPE_INSERT() e come possono restituire valori diversi.

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

Un'altra opzione che nessuno ha discusso qui è usare la clausola OUTPUT che è in SQL 2005. In questo caso, dovresti solo aggiungere la clausola di output al tuo inserto e quindi catturare quel recordset dal tuo codice. Funziona bene quando si inseriscono più record invece di 1 solo...

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;