Compartilhar via


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

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

 

http://luanmorenodba.files.wordpress.com/2012/02/image_thumb.png?w=326&h=90

 

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…

 

http://luanmorenodba.files.wordpress.com/2012/02/image_thumb1.png?w=334&h=92

 

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

 

http://luanmorenodba.files.wordpress.com/2012/02/image_thumb2.png?w=347&h=117

 

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.

 

http://luanmorenodba.files.wordpress.com/2012/02/image_thumb3.png?w=529&h=85

 

 

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

 

http://luanmorenodba.files.wordpress.com/2012/02/image_thumb4.png?w=384&h=68

 

http://luanmorenodba.files.wordpress.com/2012/02/image_thumb5.png?w=454&h=282


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 :

 

http://luanmorenodba.files.wordpress.com/2012/02/image_thumb6.png?w=469&h=78

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.