sql >> Base de Datos >  >> RDS >> Sqlserver

Use @@IDENTITY para devolver el último valor de identidad insertado en SQL Server

En SQL Server, puede usar T-SQL @@IDENTITY función del sistema para devolver el último valor de identidad insertado en la sesión actual.

Tenga en cuenta que devuelve el último valor de identidad generado en any tabla en la sesión actual . Esto contrasta con IDENT_CURRENT() función, que devuelve el último valor de identidad insertado para una tabla determinada .

El SCOPE_IDENTITY() la función es muy similar a @@IDENTITY en que también devuelve el último valor de identidad insertado en la sesión actual. La diferencia es que SCOPE_IDENTITY() se limita al alcance actual.

Ejemplo 1

Aquí hay un ejemplo de código básico de @@IDENTITY uso.

SELECT @@IDENTITY AS [Last-Inserted Identity Value];

Resultado:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+

La razón por la que esto devuelve NULL es porque abrí una nueva sesión en SQL Server y aún no he actualizado una columna de identidad durante mi sesión actual.

A continuación se muestra un código que realiza algunas actualizaciones de la columna de identidad.

CREATE TABLE Cats(id int IDENTITY);
CREATE TABLE Dogs(id int IDENTITY);

INSERT Cats DEFAULT VALUES;
INSERT Cats DEFAULT VALUES;
SELECT @@IDENTITY AS [Last-Inserted Identity Value];

Resultado:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+

Aquí, creo un par de tablas, inserto algunos datos y luego selecciono el valor de identidad actual.

El valor de identidad actual es 2 porque inserté dos filas en esa tabla.

Ahora insertemos una fila en la otra tabla:

INSERT Dogs DEFAULT VALUES;
SELECT @@IDENTITY AS [Last-Inserted Identity Value];

Resultado:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 1                              |
+--------------------------------+

El valor devuelto es 1, porque ese es el último valor de identidad insertado para esta sesión.

Ejemplo 2:Comparado con IDENT_CURRENT()

Aquí se compara con IDENT_CURRENT() .

SELECT 
  @@IDENTITY AS [@@IDENTITY],
  IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')],
  IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];

Resultado:

+--------------+-------------------------+-------------------------+
| @@IDENTITY   | IDENT_CURRENT('Cats')   | IDENT_CURRENT('Dogs')   |
|--------------+-------------------------+-------------------------|
| 1            | 2                       | 1                       |
+--------------+-------------------------+-------------------------+

Como se mencionó, IDENT_CURRENT() devuelve su resultado basado en la tabla especificada. Por lo tanto, podemos usarlo para encontrar los últimos valores de identidad para cada tabla.

Ejemplo 3:cambiar a una nueva sesión

Ahora, si abro una nueva conexión y selecciono @@IDENTITY de nuevo, esto es lo que sucede:

USE Test;
SELECT 
  @@IDENTITY AS [@@IDENTITY],
  IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')],
  IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];

Resultado:

+--------------+-------------------------+-------------------------+
| @@IDENTITY   | IDENT_CURRENT('Cats')   | IDENT_CURRENT('Dogs')   |
|--------------+-------------------------+-------------------------|
| NULL         | 2                       | 1                       |
+--------------+-------------------------+-------------------------+

El @@IDENTITY el resultado es NULL porque no he insertado nada en una columna de identidad en la nueva sesión.

El IDENT_CURRENT() los resultados no son NULL, porque su resultado se basa en la tabla, no en la sesión.

@@IDENTIDAD frente a SCOPE_IDENTITY() frente a IDENT_CURRENT()

Ver IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY en SQL Server:¿Cuál es la diferencia? para ver un ejemplo simple que explica las diferencias entre estas tres funciones.