@@Identity, Scope_Identity() e Ident_Current()–Diferenças

Posted on fevereiro 8, 2012

3


 

Sempre quando tentamos recuperar um valor de um campo Identity de uma tabela, nos deparamos com algumas dessas funções, bem aqui explicarei a função e a diferença de cada uma.

 

@@Identity

Tem como propriedade retornar o último valor inserido em uma tabela contendo identity, se está tabela não conter Identity, então a mesma retornará NULL. Se houver uma trigger que realizae a inserção de um registro em uma outra tabela, o valor retornado será o valor da inserção da trigger, isso ocorre porque está função não é limitada a somente um escopo, isso faz com que a mesma busque a informação da última tabela que recebeu um registro.

 

Entenderemos melhor está opção aqui

USE tempdb
GO
   
–    DROP TABLE dbo.DadosIdentity
–    DROP TABLE dbo.DadosIdentityLog

CREATE TABLE DadosIdentity
(
    ID INT IDENTITY(1,1) NOT NULL,
    Nome VARCHAR(50) NOT NULL,
    CPF CHAR(11) NOT NULL,
    DataNascimento DATE NULL,
)

CREATE TABLE DadosIdentityLog
 
(
    ID INT IDENTITY(1,1) NOT NULL,
    Nome VARCHAR(50) NOT NULL,
    CPF CHAR(11) NOT NULL,
    DataNascimento DATE NULL,
    [Usuário] VARCHAR(50) NOT NULL,
    DataRegistro DATETIME DEFAULT SYSDATETIME()
)

–*************************************************************
–SELECT @@IDENTITY                                        
–*************************************************************
INSERT INTO DadosIdentity (Nome, CPF, DataNascimento)
VALUES (‘Luan Moreno M. Maciel’,’02236655177′,’1988-07-20′)

SELECT @@IDENTITY AS ValorRetornado

 

image

 

Uma inserção foi realizada dentro da tabela, logo depois vemos que o ValorRetornado é 1, ou seja ele retornou o valor do último identity cadastrado dentro desta tabela.

 

Agora adicionando a trigger a esta tabela, veremos que:

 

CREATE TRIGGER trg_InsereDadosLog
ON DadosIdentity
AFTER INSERT
AS
    INSERT INTO DadosIdentityLog (Nome, CPF, DataNascimento, Usuário)
    SELECT Nome, CPF, DataNascimento, SUSER_NAME()
    FROM INSERTED

 

Adicionando um novo valor

 

INSERT INTO DadosIdentity (Nome, CPF, DataNascimento)
VALUES (‘Luan Moreno M. Maciel’,’02236655177′,’1988-07-20′)

Depois deste valor adicionado teriamos o segundo valor cadastrado na tabela, porém vemos que…

 

image

 

O valor retornado continua 1, porém na tabela temos cadastrado o valor 2.

 

image

 

Como dito anteriormente, isso ocorre porque o @@Identity, não se restringe a somente um escopo, sendo assim o valor retornado é da tabela na qual a trigger fez a inserção do seu primeiro registro, por isso temos 1 como retorno.

 

image

 

 

Scope_Identity()

Esta função, tem finalidade igual a do @@Identity, porém a mesma é limitada ao seu escopo, isto quer dizer que, quando tentarmos inserir alguns registro na tabela dbo.DadosIdentity veremos que..

 

INSERT INTO DadosIdentity (Nome, CPF, DataNascimento)
VALUES (‘Cauã Mello Ferreira’,’78765811777′,’1991-02-10′)

go 10

 

image

 

image

Neste caso0 o  valor retornado não será o da  trigger, porque a mesma não está no mesmo escopo, sendo assim o valor é do ultimo valor inserido dentro da tabela dbo.DadosIdentity como podemos vizualizar na imagem.

Ident_Current()

Está função não está relacionado a escopo e nem conexão, ela tem como objetivo retornar o último valor do Identity inserido dentro de uma tabela específica.

 

Ou seja independente das inserções em outra seção ou triggers relacionadas, está função trará o último valor registrado dentro da tabela.

 

INSERT INTO DadosIdentity (Nome, CPF, DataNascimento)
VALUES (‘Marcelo Freitas’,’78765811777′,’1992-02-17′)
go 10

SELECT IDENT_CURRENT(‘DadosIdentity’)   

INSERT INTO DadosIdentity (Nome, CPF, DataNascimento)
VALUES (‘Gabriel Ferreira’,’18725815777′,’1991-02-10′)
GO 10

SELECT IDENT_CURRENT(‘DadosIdentity’)   

SELECT *
FROM tempdb.dbo.DadosIdentity

Sendo assim temos que :

 

image

Ou seja este é o último valor inserido dentro da tabela dbo.DadosIdentity.

 

No final vemos que depende bastante do que você necessita para seu caso, se deseja saber o último valor inserido fora do escopo ou seja não somente na tabela em que deseja então a forma é utlilizar o @@Identity, se deseja saber o último valor inserido dentro de uma tabela em sua conexão/escopo então utilize o Scope_Identity(), mas se você deseja saber o último valor de um campo identity dentro de uma tabela independentemente do que for feito então utilize a Ident_Current.