@@IDENTITY (Transact-SQL)
É uma função de sistema que retorna o último valor de identidade inserido.
Sintaxe
@@IDENTITY
Tipos de retorno
numeric(38,0)
Comentários
Depois que uma instrução INSERT, SELECT INTO ou de cópia em massa é concluída, @@IDENTITY contém o último valor de identidade gerado por ela. Se a instrução não afetar nenhuma tabela com colunas de identidade, @@IDENTITY retornará NULL. Se forem inseridas várias linhas, gerando vários valores de identidade, @@IDENTITY retornará o último valor de identidade gerado. Se a instrução acionar um ou mais gatilhos que executem inserções que geram valores de identidade, a ação de chamar @@IDENTITY imediatamente após a instrução irá retornar o último valor gerado pelos gatilhos. Se um gatilho for acionado depois de uma ação de inserção em uma tabela que possui uma coluna de identidade e fizer a inserção em outra tabela que não tenha uma coluna de identidade, @@IDENTITY retornará o valor de identidade da primeira inserção. O valor @@IDENTITY não será revertido para uma configuração anterior se a instrução INSERT, SELECT INTO ou a cópia em massa falhar, ou se a transação for revertida.
Instruções e transações com falha podem alterar a identidade atual de uma tabela e criar lacunas nos valores da coluna de identidade. O valor de identidade nunca é revertido, mesmo que a transação que tentou inserir o valor na tabela não seja confirmada. Por exemplo, se uma instrução INSERT falhar por causa de uma violação IGNORE_DUP_KEY, o valor de identidade atual para a tabela ainda será incrementado.
@@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT são funções semelhantes porque retornam o último valor inserido na coluna IDENTITY de uma tabela.
@@IDENTITY e SCOPE_IDENTITY retornam o último valor de identidade gerado em qualquer tabela da sessão atual. Entretanto, SCOPE_IDENTITY só retorna o valor dentro do escopo atual; @@IDENTITY não é limitada a um escopo específico.
IDENT_CURRENT não é limitado por escopo e sessão, mas a uma tabela especificada. IDENT_CURRENT retorna o valor de identidade gerado para uma tabela específica em qualquer sessão e escopo. Para obter mais informações, consulte IDENT_CURRENT (Transact-SQL).
O escopo da função @@IDENTITY é a sessão atual do servidor local no qual ela é executada. Essa função não pode ser se aplicada a servidores remotos ou vinculados. Para obter um valor de identidade em um servidor diferente, execute um procedimento armazenado no servidor remoto ou vinculado e faça com que esse procedimento (ao ser executado no contexto do servidor remoto ou vinculado) obtenha o valor de identidade e o retorne para a conexão de chamada no servidor local.
A replicação pode afetar o valor @@IDENTITY, já que ele é usado dentro dos gatilhos de replicação e procedimentos armazenados. @@IDENTITY não será um indicador confiável da identidade mais recente criada pelo usuário se fizer parte de um artigo de replicação. Você pode usar a sintaxe de função SCOPE_IDENTITY() em vez de @@IDENTITY. Para obter mais informações, consulte SCOPE_IDENTITY (Transact-SQL)
Observação |
---|
O procedimento armazenado de chamada ou a instrução Transact-SQL devem ser reescritos para usar a função SCOPE_IDENTITY() que retornará a última identidade usada dentro do escopo daquela instrução de usuário, e não a identidade dentro do escopo do gatilho aninhado, usado pela replicação. |
Exemplos
O exemplo a seguir insere uma linha em uma tabela com uma coluna de identidade (LocationID) e usa @@IDENTITY para exibir o valor de identidade usado na nova linha.
USE AdventureWorks;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO