@@IDENTITY (Transact-SQL)
Se trata de una función del sistema que devuelve el último valor de identidad insertado.
Convenciones de sintaxis de Transact-SQL
Sintaxis
@@IDENTITY
Tipos de valor devueltos
numeric(38,0)
Comentarios
Cuando se completa una instrucción INSERT, SELECT INTO o de copia masiva, @@IDENTITY contiene el último valor de identidad generado por la instrucción. Si la instrucción no ha afectado a ninguna tabla con columnas de identidad, @@IDENTITY devuelve NULL. Si se insertan varias filas, lo que genera varios valores de identidad, @@IDENTITY devuelve el último valor de identidad generado. Si la instrucción activa uno o más desencadenadores que realizan inserciones que, a su vez, generan valores de identidad, al llamar a @@IDENTITY inmediatamente después de la instrucción, se obtiene el último valor de identidad generado por los desencadenadores. Si un desencadenador se activa tras una acción de inserción en una tabla que tiene una columna de identidad y se inserta en otra tabla que no tiene una columna de identidad, @@IDENTITY devuelve el valor de identidad de la primera inserción. Si se produce un error en la instrucción INSERT o SELECT INTO o en la copia masiva o se revierte la transacción, el valor de @@IDENTITY no revierte a un valor anterior.
Las instrucciones y las transacciones erróneas pueden modificar la identidad actual de una tabla y crear espacios en los valores de las columnas de identidad. 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. Por ejemplo, si se produce un error en una instrucción INSERT debido a una infracción de IGNORE_DUP_KEY, el valor de identidad actual de la tabla se sigue incrementando.
Las funciones @@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT se parecen, puesto que devuelven el último valor insertado en la columna IDENTITY de una tabla.
@@IDENTITY y SCOPE_IDENTITY devuelven el último valor de identidad generado en una tabla en la sesión actual. No obstante, SCOPE_IDENTITY solo devuelve el valor en el ámbito actual; @@IDENTITY no se limita a un ámbito específico.
IDENT_CURRENT no está limitado por el ámbito y la sesión; se limita a una tabla especificada. IDENT_CURRENT devuelve el valor de identidad generado para una tabla específica en cualquier sesión y cualquier ámbito. Para obtener más información, vea IDENT_CURRENT (Transact-SQL).
El ámbito de la función @@IDENTITY es la sesión actual en el servidor local en el que se ejecuta. Esta función no se puede aplicar a servidores remotos o vinculados. Para obtener un valor de identidad de un servidor diferente, ejecute un procedimiento almacenado en ese servidor remoto o vinculado y haga que dicho procedimiento (que se está ejecutando en el contexto del servidor remoto o vinculado) recopile el valor de identidad y lo devuelva a la conexión que llama del servidor local.
La replicación puede afectar al valor @@IDENTITY, ya que se usa en los desencadenadores de replicación y en los procedimientos almacenados. @@IDENTITY no es un indicador confiable de la identidad más reciente creada por el usuario si la columna forma parte de un artículo de replicación. Puede usar la sintaxis de función SCOPE_IDENTITY() en lugar de @@IDENTITY. Para obtener más información, vea SCOPE_IDENTITY (Transact-SQL).
[!NOTA]
El procedimiento almacenado o la instrucción Transact-SQL que realizan la llamada se deben volver a escribir para usar la función SCOPE_IDENTITY(), que devolverá la última identidad usada en el ámbito de esa instrucción de usuario en lugar de la identidad en el ámbito del desencadenador anidado usado por la replicación.
Ejemplos
En el siguiente ejemplo se inserta una fila en una tabla con una columna de identidad (LocationID) y se utiliza @@IDENTITY para mostrar el valor de identidad empleado en la nueva fila.
USE AdventureWorks2012;
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