Diferenças em @@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT

@@IDENTITY, SCOPE_IDENTITY() e IDENT_CURRENT() são funções similares onde retornam o último valor inserido sobre a coluna IDENTITY de uma tabela. Porém, é preciso ficar atento pois dependendo do escopo e da sessão onde são chamadas, podem retornar valores diferentes do esperado.

USE MAQUINA
GO
CREATE TABLE ATABELA1(
TB_id  int IDENTITY(1,1)PRIMARY KEY,
TB_NOME varchar(20) NOT NULL)

INSERT ATABELA1 VALUES (‘PEQUENA’)
INSERT ATABELA1 VALUES (‘MACNAMARA’)
INSERT ATABELA1 VALUES (‘PETRONIO’)

SELECT * FROM ATABELA1

– Registros em ATABELA1
TB_id   TB_NOME
——————————-
1      PEQUENA
2      MACNAMARA
3      PETRONIO

CREATE TABLE  ATABELA2(
TB2_id  int IDENTITY(100,5)PRIMARY KEY,  TB2_NOME varchar(20) NULL)

INSERT ATABELA2 (TB2_NOME) VALUES (‘PUNK ROCK’)
INSERT ATABELA2  (TB2_NOME) VALUES (‘ROCK N´ROLL’)
INSERT ATABELA2 (TB2_NOME) VALUES (‘HEAVY METAL’)

SELECT * FROM ATABELA2

– Registros em ATABELA2
TB2_id  TB2_NOM
—————
100   PUNK ROCK
105   ROCK N´ROLL
110  HEAVY METAL

/* Cria uma trigger que insere um registro em ATABELA2 quando um registro é inserido em ATABELA1 */
CREATE TRIGGER T1_trig ON ATABELA1  FOR INSERT AS
BEGIN
INSERT ATABELA2 VALUES (”)
END

@@IDENTITY

Apesar de @@IDENTITY ser conhecido como uma variável global, ele é isolado por sessão, ou seja, retorna o último valor identity inserido em qualquer tabela desde que seja na sessão corrente. Entenda sessão como sendo uma conexão.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para @@IDENTITY */
INSERT ATABELA1 VALUES (‘ROSELI KHOL’)
SELECT @@IDENTITY AS [@@IDENTITY]
— Retorna 115 – valor identity inserido sobre a tabela ATABELA2
GO

O problema aqui é que a tabela ATABELA1 possui um trigger que também gera insert em outra tabela com identity (ATABELA2). O valor de @@IDENTITY é alterado devido ao insert realizado pelo trigger, desta forma o valor que será retornado não é o identity para ATABELA1, mas sim o identity para ATABELA2.

IDENT_CURRENT()

IDENT_CURRENT não é limitado por escopo ou sessão, mas sim por uma tabela em específico. IDENT_CURRENT retorna o último valor identity inserido em uma determinada tabela em qualquer sessão ou escopo.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para IDENT_CURRENT */
INSERTATABELA1 VALUES (‘ROSELI KHOL‘)
SELECT IDENT_CURRENT(‘ATABELA1′) AS [IDENT_CURRENT
] — Retorna 4 – valor identity inserido sobre a tabela ATABELA1
GO

Se estiver testando isso, irá parecer que funcionou, devolverá o valor identity para a tabela ATABELA1. O problema é que o IDENT_CURRENT não está preso a uma sessão, então se estiver ocorrendo inserções simultâneas sobre a tabela ATABELA1, o valor que ele poderá estar retornando pode não ser o da sua inserção.

SCOPE_IDENTITY()

Assim como @@IDENTITY, SCOPE_IDENTITY() retornará o último valor identity inserido em qualquer tabela na sessão corrente.

Exemplo:

/* Dispara a trigger e retorna o valor obtido para SCOPE_IDENTITY */
INSERT ATABELA1 VALUES (‘ROSELI KHOL’)
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
— Retorna 4 – valor identity inserido sobre a tabela ATABELA1
GO

Entretando, SCOPE_IDENTITY é limitado a um escopo e com isso retornará o último valor identity inserido dentro do escopo de um determinado batch. Como o trigger é considerado um outro escopo, o valor de identity da tabela ATABELA1  será devolvido corretamente

Referências:  http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=59


  1. Nenhum trackbacks ainda.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.