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
Nenhum trackbacks ainda.