Compartir a través de


@@IDENTITY (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLBase de datos SQL en Microsoft Fabric

@@IDENTITY es una función del sistema que devuelve el último valor identidad insertado.

Convenciones de sintaxis de Transact-SQL

Sintaxis

@@IDENTITY  

Tipos de retorno

numeric(38,0)

Observaciones

Después de completar una INSERTsentencia , SELECT INTO, o copia masiva, @@IDENTITY contiene el último valor identidad que genera la sentencia.

  • Si la sentencia no afectó a ninguna tabla con columnas de identidad, @@IDENTITY devuelve NULL.
  • Si se insertan varias filas, generando múltiples valores de identidad, @@IDENTITY se devuelve el último valor de identidad generado.
  • Si la sentencia activa uno o más disparadores que realizan inserciones que generan valores de identidad, llamar @@IDENTITY inmediatamente después de la sentencia devuelve el último valor de identidad generado por los disparadores.
  • Si se activa un disparador tras una acción de inserción en una tabla que tiene una columna identidad, y el disparador se inserta en otra tabla que no tiene columna identidad, @@IDENTITY devuelve el valor identidad del primer inserto. El @@IDENTITY valor no vuelve a una configuración anterior si falla la INSERT instrucción o SELECT INTO la copia masiva, o si la transacción se revierte.

Las instrucciones y transacciones con errores pueden cambiar la identidad actual de una tabla y crear huecos en los valores de columna 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 una sentencia INSERT falla debido a una IGNORE_DUP_KEY violación, el valor de identidad actual de la tabla sigue incrementándose.

@@IDENTITY, SCOPE_IDENTITY, y IDENT_CURRENT son funciones similares porque todas devolven el último valor insertado en la IDENTITY columna de una tabla.

  • @@IDENTITY y SCOPE_IDENTITY devolver el último valor identidad generado en cualquier tabla de la sesión actual. Sin embargo, SCOPE_IDENTITY devuelve el valor solo dentro del alcance actual; @@IDENTITY no está limitado a un ámbito específico.

  • IDENT_CURRENT no está limitada por el alcance y la sesión; está limitado a una tabla especificada. IDENT_CURRENT devuelve el valor identidad generado para una tabla específica en cualquier sesión y en cualquier alcance. Para obtener más información, vea IDENT_CURRENT (Transact-SQL).

El alcance de la @@IDENTITY función 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 @@IDENTITY valor, ya que se utiliza dentro de los disparadores de replicación y los procedimientos almacenados. @@IDENTITY no es un indicador fiable de la identidad creada por el usuario más reciente si la columna forma parte de un artículo de replicación. Puedes usar la SCOPE_IDENTITY() sintaxis de funciones en lugar de @@IDENTITY. Para más información, vea SCOPE_IDENTITY (Transact-SQL)

Nota

Es necesario reescribir la instrucción Transact-SQL o el procedimiento almacenado que realiza la llamada para que usen la función SCOPE_IDENTITY(), lo que devuelve 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 AdventureWorks2022;  
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