@@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.