SCOPE_IDENTITY (Transact-SQL)SCOPE_IDENTITY (Transact-SQL)

APLICA-SE A: simSQL Server (a partir do 2008) simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Retorna o último valor de identidade inserido em uma coluna de identidade no mesmo escopo.Returns the last identity value inserted into an identity column in the same scope. Um escopo é um módulo: um procedimento armazenado, gatilho, função ou lote.A scope is a module: a stored procedure, trigger, function, or batch. Portanto, se duas instruções forem estar no mesmo procedimento armazenado, função ou lote, elas estarão no mesmo escopo.Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

SCOPE_IDENTITY()  

Tipos de retornoReturn Types

numeric(38,0)numeric(38,0)

RemarksRemarks

SCOPE_IDENTITY, IDENT_CURRENT, e @@IDENTITY são funções semelhantes porque retornam valores inseridos em colunas de identidade.SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions because they return values that are inserted into identity columns.

IDENT_CURRENT não é limitado por escopo e sessão, mas a uma tabela especificada.IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT retorna o valor gerado para uma tabela específica em qualquer sessão e escopo.IDENT_CURRENT returns the value generated for a specific table in any session and any scope. Para obter mais informações, consulte IDENT_CURRENT (Transact-SQL).For more information, see IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY e @@IDENTITY retornam o último valor de identidade gerado em qualquer tabela da sessão atual.SCOPE_IDENTITY and @@IDENTITY return the last identity values that are generated in any table in the current session. Entretanto, SCOPE_IDENTITY só retornará valores inseridos no escopo atual; @@IDENTITY não está limitado a um escopo específico.However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

Por exemplo, há duas tabelas, T1 e T2e um gatilho INSERT é definido em T1.For example, there are two tables, T1 and T2, and an INSERT trigger is defined on T1. Quando uma linha é inserida em T1, o gatilho é acionado e insere uma linha em T2.When a row is inserted to T1, the trigger fires and inserts a row in T2. Esse cenário ilustra dois escopos: a inserção em T1e a inserção em T2 pelo gatilho.This scenario illustrates two scopes: the insert on T1, and the insert on T2 by the trigger.

Supondo que T1 e T2 tenham colunas de identidade, @@IDENTITY e SCOPE_IDENTITY retornem valores diferentes no fim de uma instrução INSERT em T1.Assuming that both T1 and T2 have identity columns, @@IDENTITY and SCOPE_IDENTITY return different values at the end of an INSERT statement on T1. @@IDENTITY retorna o último valor de coluna de identidade inserido em qualquer escopo na sessão atual.@@IDENTITY returns the last identity column value inserted across any scope in the current session. É o valor inserido em T2.This is the value inserted in T2. SCOPE_IDENTITY() retorna o valor IDENTITY inserido em T1.SCOPE_IDENTITY() returns the IDENTITY value inserted in T1. Foi a última inserção que ocorreu no mesmo escopo.This was the last insert that occurred in the same scope. A função SCOPE_IDENTITY() retornará o valor nulo se for invocada antes que qualquer instrução INSERT em uma coluna de identidade ocorra no escopo.The SCOPE_IDENTITY() function returns the null value if the function is invoked before any INSERT statements into an identity column occur in the scope.

Instruções e transações com falha podem alterar a identidade atual de uma tabela e criar lacunas nos valores da coluna de identidade.Failed statements and transactions can change the current identity for a table and create gaps in the identity column values. O valor de identidade nunca é revertido, mesmo que a transação que tentou inserir o valor na tabela não seja confirmada.The identity value is never rolled back even though the transaction that tried to insert the value into the table is not committed. 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.For example, if an INSERT statement fails because of an IGNORE_DUP_KEY violation, the current identity value for the table is still incremented.

ExemplosExamples

A.A. Usando @@IDENTITY e SCOPE_IDENTITY com gatilhosUsing @@IDENTITY and SCOPE_IDENTITY with triggers

O exemplo a seguir cria duas tabelas, TZ e TY, e um gatilho INSERT em TZ.The following example creates two tables, TZ and TY, and an INSERT trigger on TZ. Quando uma linha é inserida na tabela TZ, o gatilho (Ztrig) é acionado e insere uma linha em TY.When a row is inserted to table TZ, the trigger (Ztrig) fires and inserts a row in 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: esta é a aparência da tabela TZ.Result set: This is how table TZ looks.

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: esta é a aparência de TY:Result set: This is how TY looks:

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 the trigger that inserts a row in table TY when a row is inserted in table TZ.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

Dispara o gatilho com FIRE e determina quais valores de identidade você obtém com as funções @@IDENTITY e SCOPE_IDENTITY.FIRE the trigger and determine what identity values you obtain with the @@IDENTITY and SCOPE_IDENTITY functions.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Aqui está o conjunto de resultados.Here is the result set.

/*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.B. Usando @@IDENTITY e SCOPE_IDENTITY() com replicaçãoUsing @@IDENTITY and SCOPE_IDENTITY() with replication

Os exemplos a seguir mostram como usar @@IDENTITY e SCOPE_IDENTITY() para inserções em um banco de dados publicado para replicação de mesclagem.The following examples show how to use @@IDENTITY and SCOPE_IDENTITY() for inserts in a database that is published for merge replication. As duas tabelas dos exemplos estão no banco de dados de exemplo AdventureWorks2012AdventureWorks2012: Person.ContactType não é publicado e Sales.Customer é publicado.Both tables in the examples are in the AdventureWorks2012AdventureWorks2012 sample database: Person.ContactType is not published, and Sales.Customer is published. A replicação de mesclagem adiciona gatilhos a tabelas que são publicadas.Merge replication adds triggers to tables that are published. Portanto, @@IDENTITY pode retornar o valor da inserção em uma tabela do sistema de replicação em vez da inserção em uma tabela de usuário.Therefore, @@IDENTITY can return the value from the insert into a replication system table instead of the insert into a user table.

A tabela Person.ContactType tem um valor de identidade máximo de 20.The Person.ContactType table has a maximum identity value of 20. Se você inserir uma linha na tabela, @@IDENTITY e SCOPE_IDENTITY() retornarão o mesmo valor.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return the same value.

USE AdventureWorks2012;  
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.Here is the result set.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

A tabela Sales.Customer tem um valor de identidade máximo de 29483.The Sales.Customer table has a maximum identity value of 29483. Se você inserir uma linha na tabela, @@IDENTITY e SCOPE_IDENTITY() retornarão valores diferentes.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return different values. SCOPE_IDENTITY() retorna o valor da inserção em uma tabela de usuário, enquanto @@IDENTITY retorna o valor da inserção na tabela do sistema de replicação.SCOPE_IDENTITY() returns the value from the insert into the user table, whereas @@IDENTITY returns the value from the insert into the replication system table. Use SCOPE_IDENTITY() para aplicativos que requerem acesso ao valor de identidade inserido.Use SCOPE_IDENTITY() for applications that require access to the inserted identity value.

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.Here is the result set.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Consulte TambémSee Also

@@IDENTITY (Transact-SQL)@@IDENTITY (Transact-SQL)