Esta é uma dúvida comum entre desenvolvedores.
Em muitas situações, você deseja saber o código que acabou de inserir.
Para isso precisamos saber o IDENTITY, mas qual deles? Existem 3 opções.
SCOPE_IDENTITY() - Retorna o último ID inserido dentro daquele escopo(Procedure, Função, etc).
Recomendo sempre utilizar este.
IDENT_CURRENT('nomedatabela') - Retorna o último ID inserido em uma determinada tabela, independente de conexão, escopo, etc.
Muito Cuidado com esta, pois você pode pegar o ID de outro insert.
@@IDENTITY - Retorna o último ID inserido na conexão atual, independente de tabela.
Evite usar este, a chance de ter problema é enorme.
Vamos aos testes.
CRIAÇÃO DO AMBIENTE:
CREATE TABLE Cliente
(
CodCliente int identity(1,1) primary key,
Nome varchar(50)
)
GO
CREATE TABLE Registro
(
CodReg int identity(1,1) primary key,
Nome varchar(50),
Data datetime default getdate()
)
GO
INSERT INTO Registro(Nome) values('Teste1'),('Teste2')
GO
CREATE TRIGGER tg_Cliente ON Cliente
For Insert
AS
INSERT INTO Registro(Nome)
SELECT Nome FROM inserted
GO
Verifique o cenário atual:
SELECT * from Cliente
SELECT * from Registro
--Como não tem nenhum registro na tabela Cliente, deve retornar Código 1
INSERT INTO Cliente(Nome) VALUES ('José')
SELECT Scope_Identity() as CódigoCliente
--O último registro inserido foi 1, então ele deve retornar o Código 2
INSERT INTO Cliente(Nome) VALUES ('João')
SELECT Ident_Current('Cliente') as CódigoCliente
--O último registro inserido foi 2, então ele deveria retornar o Código 3, porém ele pega o Código 5(da tabela Registro), que foi inserido pela trigger, pois está na mesma conexão.
INSERT INTO Cliente(Nome) VALUES ('Manuel')
SELECT @@IDENTITY as Código
Muito cuidado ao utilizar estes comandos, analisem bem a situação.