Nesse artigo mostrarei as diferenças entre as funções SCOPE_IDENTITY(), @@ IDENTITY, e IDENT_CURRENT.
Vamos começar pelo SCOPE_IDENTITY()
Essa função retorna o último ID inserido em uma coluna identity dentro de um mesmo escopo que pode ser uma função, uma trigger, uma procedure ou um procedimento batch.
Vou exemplificar isso em uma pequena procedure…
Primeiro vou criar um modelo com 3 tabelas. tb_Carro, tb_Fabricante e uma terceira tabela que vincula o carro ao fabricante.
Em seguida, vou criar uma procedure para inserir registros na tabela carro. Porém, quando inserimos um “carro”, precisamos vinculá-lo a um fabricante.
Aí que entra o SCOPE_IDENTITY. Veja:
USE GUIADBA; Go If Object_id('tb_Carro')is not null Drop Table tb_Carro Go Create table tb_Carro ( id_carro int identity, nome_Carro varchar(100) ); Insert into tb_Carro (nome_Carro) values('Carro A1'); Select * From tb_Carro If Object_id('tb_Fabricante')is not null Drop Table tb_Fabricante Go Create table tb_Fabricante ( id_Fabricante int identity, nome_Fabricante varchar(100) ); Insert into tb_Fabricante (nome_Fabricante) values ('Fabricante 1'); Go Select * From tb_Fabricante If Object_id('tb_Carro_Fabricante')is not null Drop Table tb_Carro_Fabricante Go Create table tb_Carro_Fabricante ( id_Carro_Fabricante int identity, id_Fabricante int, id_Carro int ); Insert into tb_Carro_Fabricante (id_Fabricante,id_Carro) values (1,1); Select * From tb_Carro_Fabricante
Quando eu chamo a procedure, passo dois parâmetros: O nome do carro e o nome do fabricante.
O procedimento faz um insert na tabela tb_Carro e esse registro precisa ser vinculado na tabela tb_Carro_Fabricante para o fabricante passado por parâmetro.
Então, para o insert na tabela tb_Carro_Fabricante, eu criei uma variável local para pegar o ID do fabricante e usei o SCOPE_IDENTITY() para pegar o id_Carro inserido no contexto.
if object_id('Carro_inserir') is not null Drop Procedure Carro_inserir Go Create proc Carro_inserir (@nome varchar(100), @fabricante varchar(100)) As Declare @id_fabricante int Select @id_fabricante = id_Fabricante From tb_Fabricante Where nome_Fabricante = @fabricante Begin insert tb_Carro (nome_Carro) Select @nome Insert into tb_Carro_Fabricante (id_Fabricante,id_Carro) Select @id_fabricante, SCOPE_IDENTITY() End Go Exec Carro_inserir 'Carro B1', 'Fabricante 1' Select * From tb_Carro Select * From tb_Carro_Fabricante
A diferença entre SCOPE_IDENTITY() e @@IDENTITY é que o primeiro limita-se a retornar o último ID dentro de um escopo. O @@IDENTITY não se limita a um escopo.
Após a execução da procedure acima, execute:
Select SCOPE_IDENTITY()
Ele vai retornar 1, porém o último identity inserido foi 2. Como o escopo já foi finalizado, o SCOPE_IDENTITY()
retorna 1.
Para retornar o último IDENTITY contando todas as tabelas do banco, usamos Select @@IDENTITY que retornará o último ID inserido que foi na tabela tb_Carro_Fabricante, id_Carro_Fabricante que é = 2.
A função IDENT_CURRENT retorna o último identity gerado em uma tabela específica.
Select IDENT_CURRENT('tb_Carro') Select IDENT_CURRENT('tb_Fabricante') Select IDENT_CURRENT('tb_Carro_Fabricante')