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.