@@IDENTITY / SCOPE_IDENTITY() / IDENT_CURRENT

@@IDENTITY / SCOPE_IDENTITY() / IDENT_CURRENT

Tempo de leitura: 2 minutos

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

  1. Boa dica, vou parar de usar o select max nesse caso.

Deixe uma resposta

%d blogueiros gostam disto: