Compartir a través de


@@IDENTITY (Transact-SQL)

Se trata de una función del sistema que devuelve el último valor de identidad insertado.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

@@IDENTITY

Tipos de valor devueltos

numeric(38,0)

Notas

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 nunca se revierte, aunque no se confirme la transacción que intentaba 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 sólo 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 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