sql >> Databasteknik >  >> RDS >> Sqlserver

Använd @@IDENTITY för att returnera det senast införda identitetsvärdet i SQL Server

I SQL Server kan du använda T-SQL @@IDENTITY systemfunktion för att returnera det senast infogade identitetsvärdet i den aktuella sessionen.

Observera att den returnerar det senaste identitetsvärdet som genererats i någon tabell i den aktuella sessionen . Detta är i motsats till IDENT_CURRENT() funktion, som returnerar det senast infogade identitetsvärdet för en given tabell .

SCOPE_IDENTITY() funktionen är mycket lik @@IDENTITY genom att den också returnerar det senast infogade identitetsvärdet i den aktuella sessionen. Skillnaden är att SCOPE_IDENTITY() är begränsad till den nuvarande omfattningen.

Exempel 1

Här är ett grundläggande kodexempel på @@IDENTITY användning.

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

Resultat:

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

Anledningen till att detta returnerar NULL beror på att jag öppnade en ny session till SQL Server och jag har ännu inte uppdaterat en identitetskolumn under min nuvarande session.

Nedan finns en kod som gör vissa uppdateringar av identitetskolumnen.

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];

Resultat:

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

Här skapar jag ett par tabeller, infogar lite data och väljer sedan det aktuella identitetsvärdet.

Det aktuella identitetsvärdet är 2 eftersom jag infogade två rader i den tabellen.

Låt oss nu infoga en rad i den andra tabellen:

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

Resultat:

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

Det returnerade värdet är 1, eftersom det är det senast infogade identitetsvärdet för den här sessionen.

Exempel 2 – Jämfört med IDENT_CURRENT()

Här jämförs det med IDENT_CURRENT() .

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

Resultat:

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

Som nämnts, IDENT_CURRENT() returnerar sitt resultat baserat på den angivna tabellen. Därför kan vi använda den för att hitta de sista identitetsvärdena för varje tabell.

Exempel 3 – Byt till en ny session

Om jag nu öppnar en ny anslutning och väljer @@IDENTITY igen, det här är vad som händer:

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

Resultat:

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

@@IDENTITY resultatet är NULL eftersom jag inte har infogat något i en identitetskolumn i den nya sessionen.

IDENT_CURRENT() resultaten är inte NULL, eftersom dess resultat baseras på tabellen – inte sessionen.

@@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT()

Se IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY i SQL Server:Vad är skillnaden? för ett enkelt exempel som går igenom skillnaderna mellan dessa tre funktioner.


  1. Hur implementerar man SQLite-databas för att lagra bitmappsbild och text?

  2. Databassäkerhet i Oracle

  3. postgresql COUNT(DISTINCT ...) mycket långsamt

  4. SQL Developer-skriptutgång trunkerar sys_refcursor-bredden