Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Devolve o último valor de identidade inserido numa coluna de identidade no mesmo âmbito. Um âmbito é um módulo: um procedimento armazenado, trigger, função ou batch. Portanto, se duas instruções estiverem no mesmo procedimento armazenado, função ou lote, estão no mesmo âmbito.
Transact-SQL convenções de sintaxe
Sintaxe
SCOPE_IDENTITY()
Tipos de devolução
numérico(38,0)
Observações
SCOPE_IDENTITY, IDENT_CURRENT e @@IDENTITY são funções semelhantes porque devolvem valores que são inseridos em colunas identidade.
IDENT_CURRENT não está limitada pelo âmbito e pela sessão; está limitada a uma tabela especificada. IDENT_CURRENT devolve o valor gerado para uma tabela específica em qualquer sessão e em qualquer escopo. Para mais informações, veja IDENT_CURRENT (Transact-SQL).
SCOPE_IDENTITY e @@IDENTITY retornam os últimos valores de identidade gerados em qualquer tabela da sessão atual. No entanto, SCOPE_IDENTITY devolve valores inseridos apenas dentro do âmbito atual; @@IDENTITY não se limita a um âmbito específico.
Por exemplo, existem duas tabelas, T1 e T2, e um gatilho INSERT é definido no T1. Quando uma linha é inserida em T1, o gatilho dispara e insere uma linha em T2. Este cenário ilustra dois oscilos: o inserto no T1 e o inserto no T2 junto ao gatilho.
Assumindo que tanto T1 como T2 têm colunas identidade, @@IDENTITY e SCOPE_IDENTITY devolvem valores diferentes no final de uma instrução INSERT em T1. @@IDENTITY devolve o último valor da coluna identidade inserido em qualquer âmbito da sessão atual. Este é o valor inserido em T2. SCOPE_IDENTITY() devolve o valor IDENTITY inserido em T1. Este foi o último inserto que ocorreu no mesmo escopo. A função SCOPE_IDENTITY() devolve o valor nulo se a função for invocada antes de quaisquer instruções INSERT numa coluna de identidade ocorrerem no âmbito.
Extratos e transações falhados podem alterar a identidade atual de uma tabela e criar lacunas nos valores das colunas de identidade. O valor 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 devido a uma violação de IGNORE_DUP_KEY, o valor de identidade atual da tabela continua a ser incrementado.
Examples
A. Usar @@IDENTITY e SCOPE_IDENTITY com gatilhos
O exemplo seguinte cria duas tabelas, TZ e TY, e um gatilho INSERT em TZ. Quando uma linha é inserida na tabela TZ, o gatilho (Ztrig) dispara e insere uma linha em TY.
USE tempdb;
GO
CREATE TABLE TZ (
Z_id INT IDENTITY(1,1)PRIMARY KEY,
Z_name VARCHAR(20) NOT NULL);
INSERT TZ
VALUES ('Lisa'),('Mike'),('Carla');
SELECT * FROM TZ;
Conjunto de resultados: É assim que a tabela TZ se apresenta.
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla
CREATE TABLE TY (
Y_id INT IDENTITY(100,5)PRIMARY KEY,
Y_name VARCHAR(20) NULL);
INSERT TY (Y_name)
VALUES ('boathouse'), ('rocks'), ('elevator');
SELECT * FROM TY;
Conjunto de resultados: É assim que o TY se apresenta:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator
Crie o gatilho que insere uma linha na tabela TY quando uma linha é inserida na tabela TZ.
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END;
DISPARA o gatilho e determina que valores de identidade obténs com as funções @@IDENTITY e SCOPE_IDENTITY.
INSERT TZ VALUES ('Rosalie');
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Aqui está o conjunto de resultados.
/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`
SCOPE_IDENTITY
4
/*@@IDENTITY returns the last identity value inserted to TY by the trigger.
This fired because of an earlier insert on TZ.*/
@@IDENTITY
115
B. Usar @@IDENTITY e SCOPE_IDENTITY() com replicação
Os exemplos seguintes mostram como usar @@IDENTITY e SCOPE_IDENTITY() para inserções numa base de dados publicada para replicação de fusões. Ambas as tabelas nos exemplos estão na AdventureWorks2025 base de dados de exemplo: Person.ContactType não é publicado, e Sales.Customer é publicado. A replicação de fusão adiciona gatilhos às tabelas que são publicadas. Assim, @@IDENTITY pode devolver o valor do inserto para uma tabela do sistema de replicação em vez do inserto para uma tabela de utilizador.
A Person.ContactType tabela tem um valor máximo de identidade de 20. Se inserires uma linha na tabela @@IDENTITY e SCOPE_IDENTITY() devolveres o mesmo valor.
USE AdventureWorks2022;
GO
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Aqui está o conjunto de resultados.
SCOPE_IDENTITY
21
@@IDENTITY
21
A Sales.Customer tabela tem um valor máximo de identidade de 29483. Se inserires uma linha na tabela @@IDENTITY e SCOPE_IDENTITY() devolveres valores diferentes.
SCOPE_IDENTITY() retorna o valor do insert para a tabela de utilizador, enquanto @@IDENTITY retorna o valor do insert para a tabela do sistema de replicação. Uso SCOPE_IDENTITY() para aplicações que requerem acesso ao valor de identidade inserido.
INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Aqui está o conjunto de resultados.
SCOPE_IDENTITY
29484
@@IDENTITY
89