Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

obter novo ID de registro SQL

SELECT SCOPE_IDENTITY() 

usar @@IDENTITY pode ter resultados inesperados, então tenha cuidado ao usar esse. Triggers que inserem registros em outras tabelas farão com que o valor @@IDENTITY mude - onde SCOPE_IDENTITY() fornecerá a última identidade apenas do seu escopo atual.

Aqui está um exemplo que mostrará a diferença entre @@IDENTITY e SCOPE_INSERT() e como eles podem retornar valores diferentes.
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

Outra opção que ninguém discutiu aqui é usar a cláusula OUTPUT que está no SQL 2005. Nesse caso, você só teria que adicionar a cláusula de saída à sua inserção e depois capturar esse conjunto de registros do seu código. Isso funciona bem ao inserir vários registros em vez de apenas 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;