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

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito.Returns the last identity value inserted into an identity column in the same scope. Un ámbito es un módulo: un procedimiento almacenado, desencadenador, función o lote.A scope is a module: a stored procedure, trigger, function, or batch. Por tanto, si dos instrucciones se encuentran en el mismo procedimiento almacenado, función o lote, están en el mismo ámbito.Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

SCOPE_IDENTITY()  

Tipos devueltosReturn Types

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

NotasRemarks

SCOPE_IDENTITY, IDENT_CURRENT y @@IDENTITY son funciones parecidas ya que devuelven valores insertados en columnas de identidad.SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions because they return values that are inserted into identity columns.

IDENT_CURRENT no está limitado por el ámbito y la sesión; se limita a una tabla especificada.IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT devuelve el valor generado para una tabla específica en cualquier sesión y cualquier ámbito.IDENT_CURRENT returns the value generated for a specific table in any session and any scope. Para obtener más información, vea IDENT_CURRENT (Transact-SQL).For more information, see IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY y @@IDENTITY devuelven los últimos valores de identidad generados en una tabla en la sesión actual.SCOPE_IDENTITY and @@IDENTITY return the last identity values that are generated in any table in the current session. No obstante, SCOPE_IDENTITY solo devuelve los valores insertados en el ámbito actual; @@IDENTITY no se limita a un ámbito específico.However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

Por ejemplo, suponga que hay dos tablas, T1 y T2, y un desencadenador INSERT definido en T1.For example, there are two tables, T1 and T2, and an INSERT trigger is defined on T1. Cuando se inserta una fila en T1, el desencadenador se activa e inserta una fila en T2.When a row is inserted to T1, the trigger fires and inserts a row in T2. Este escenario muestra dos ámbitos: la inserción en T1 y la inserción en T2 como resultado del desencadenador.This scenario illustrates two scopes: the insert on T1, and the insert on T2 by the trigger.

Suponiendo que T1 y T2 tienen columnas de identidad, @@IDENTITY y SCOPE_IDENTITY devolverán distintos valores al finalizar una instrucción INSERT en 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 devolverá el último valor de la columna de identidad insertado en cualquier ámbito en la sesión actual.@@IDENTITY returns the last identity column value inserted across any scope in the current session. Este es el valor insertado en T2.This is the value inserted in T2. SCOPE_IDENTITY() devuelve el valor IDENTITY insertado en T1.SCOPE_IDENTITY() returns the IDENTITY value inserted in T1. Es la última inserción que se ha producido en el mismo ámbito.This was the last insert that occurred in the same scope. La función SCOPE_IDENTITY() devuelve el valor NULL si se llama a la función antes de que se ejecuten las instrucciones INSERT en una columna de identidad del ámbito.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.

Las instrucciones y transacciones con errores pueden cambiar la identidad actual de una tabla y crear huecos en los valores de columna de identidad.Failed statements and transactions can change the current identity for a table and create gaps in the identity column values. El valor de identidad jamás se revierte, aun cuando no se haya confirmado la transacción que intentó insertar el valor en la tabla.The identity value is never rolled back even though the transaction that tried to insert the value into the table is not committed. Por ejemplo, si se produce un error en una instrucción INSERT debido a una infracción de tipo IGNORE_DUP_KEY, el valor de identidad actual de la tabla se sigue incrementando.For example, if an INSERT statement fails because of an IGNORE_DUP_KEY violation, the current identity value for the table is still incremented.

EjemplosExamples

A.A. Uso de @@IDENTITY y SCOPE_IDENTITY con desencadenadoresUsing @@IDENTITY and SCOPE_IDENTITY with triggers

Este ejemplo crea dos tablas, TZ y TY, y un desencadenador INSERT en TZ.The following example creates two tables, TZ and TY, and an INSERT trigger on TZ. Cuando se inserta una fila en TZ, el desencadenador Ztrig se activa e inserta una fila en 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 es la apariencia de la tabla 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 es la apariencia de TY:Result set: This is how TY looks:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

Cree el desencadenador que inserta una fila en una tabla TY cuando se inserta una fila en una tabla 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;  

ACTIVE el desencadenador y determine los valores de identidad que se obtienen con las funciones @@IDENTITY y 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  

El conjunto de resultados es el siguiente.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. Uso de @@IDENTITY y SCOPE_IDENTITY() con una replicaciónUsing @@IDENTITY and SCOPE_IDENTITY() with replication

Los ejemplos siguientes muestran cómo se usan @@IDENTITY y SCOPE_IDENTITY() para las inserciones en una base de datos publicada para la replicación de mezcla.The following examples show how to use @@IDENTITY and SCOPE_IDENTITY() for inserts in a database that is published for merge replication. Las dos tablas de los ejemplos se encuentran en la base de datos de ejemplo AdventureWorks2012AdventureWorks2012: Person.ContactType no está publicado y Sales.Customer sí.Both tables in the examples are in the AdventureWorks2012AdventureWorks2012 sample database: Person.ContactType is not published, and Sales.Customer is published. La replicación de mezcla agrega desencadenadores a las tablas publicadas.Merge replication adds triggers to tables that are published. Por lo tanto, @@IDENTITY puede devolver el valor de la inserción en una tabla de sistema de replicación en lugar de la inserción en una tabla de usuario.Therefore, @@IDENTITY can return the value from the insert into a replication system table instead of the insert into a user table.

La tabla Person.ContactType tiene un valor de identidad máximo de 20.The Person.ContactType table has a maximum identity value of 20. Si inserta una fila en la tabla, @@IDENTITY y SCOPE_IDENTITY() devolverán el mismo 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  

El conjunto de resultados es el siguiente.Here is the result set.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

La tabla Sales.Customer tiene un valor de identidad máximo de 29483.The Sales.Customer table has a maximum identity value of 29483. Si inserta una fila en la tabla, @@IDENTITY y SCOPE_IDENTITY() devolverán valores diferentes.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return different values. SCOPE_IDENTITY() devuelve el valor de la inserción en la tabla de usuario, mientras que @@IDENTITY devuelve el valor de la inserción en la tabla del sistema de replicación.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 las aplicaciones que necesitan obtener acceso al valor de identidad insertado.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  

El conjunto de resultados es el siguiente.Here is the result set.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Consulte tambiénSee Also

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