@@IDENTITY / SCOPE_IDENTITY() / IDENT_CURRENT
Quando for necessário resgatar o valor de uma coluna auto incremento no SQL Server, é recomendado que use a opção SCOPE_IDENTITY(). Abaixo segue o comportamento das opções existem para esta função.
@@IDENTITY: Retorna o ultimo valor de identidade gerado para qualquer tabela na sessão atual dentro de qualquer escopo.
SCOPE_IDENTITY():Retorna o ultimo valor de identidade gerado para qualquer tabela na sessão atual para o comando e escopo atual.
IDENT_CURRENT: Retorna o ultimo valor de identidade gerado para uma tabela especifica em qualquer sessão e em qualquer escopo.
Ex:
USE tempdb;
GO
if exists(select name from sys.objects where object_id= OBJECT_ID(‘dbo.t6’) and type = ‘U’)
begin
DROP TABLE dbo.t6;
end
if exists(select name from sys.objects where object_id=OBJECT_ID(‘dbo.t7′) and type=’U’)
begin
DROP TABLE dbo.t7;
end
GO
CREATE TABLE dbo.t6(id int IDENTITY);
CREATE TABLE dbo.t7(id int IDENTITY(100,1));
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
INSERT dbo.t7 DEFAULT VALUES
END;
GO
SELECT * FROM dbo.t6;
–id é branco
SELECT * FROM dbo.t7;
–id é branco
–Executar este codigo na sessao 1(janela do SSMS)
INSERT dbo.t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Retorna o valor 100. Que foi inserido pela trigger.*/
SELECT SCOPE_IDENTITY();
/* Retorna o valor 1. Esta valor foi inserido por uma instrução INSERT duas instruções antes desta query*/
SELECT IDENT_CURRENT(‘dbo.t7’);
/* Retorna o valor dentro de t7, que foi inserido pela trigger. Fora do escopo atual.*/
SELECT IDENT_CURRENT(‘dbo.t6’);
/* Returns value inserted into t6. Esta valor foi inserido por uma instrução INSERT quatro instruções antes desta query.*/
DROP TRIGGER t6ins
— Executar este codigo na sessao 2 (uma segunda janela no SSMS)
SELECT @@IDENTITY;
/* Retorna NULO, porque nenhuma instrução de INSERT foi gerada neste ponto para esta sessão*/
SELECT SCOPE_IDENTITY();
/* Retorna NULO, porque nenhuma instrução de INSERT foi gerada neste escopo para esta sessão*/
SELECT IDENT_CURRENT(‘t7’);
/* Retorna o ultimo valor inserido dentro de t7 = 100*/
Referência:
http://msdn.microsoft.com/pt-br/library/ms190315.aspx
Espero ter ajudado!
Um comentário
Boa dica, vou parar de usar o select max nesse caso.