sql >> Database teknologi >  >> RDS >> Sqlserver

Brug @@IDENTITY til at returnere den sidst indsatte identitetsværdi i SQL Server

I SQL Server kan du bruge T-SQL @@IDENTITY systemfunktion for at returnere den sidst indsatte identitetsværdi i den aktuelle session.

Bemærk, at det returnerer den sidst genererede identitetsværdi i enhver tabel i den aktuelle session . Dette er i modsætning til IDENT_CURRENT() funktion, som returnerer den sidst indsatte identitetsværdi for en given tabel .

SCOPE_IDENTITY() funktion er meget lig @@IDENTITY ved at den også returnerer den sidst indsatte identitetsværdi i den aktuelle session. Forskellen er, at SCOPE_IDENTITY() er begrænset til det nuværende omfang.

Eksempel 1

Her er et grundlæggende kodeeksempel på @@IDENTITY brug.

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

Resultat:

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

Grunden til at dette returnerer NULL skyldes, at jeg åbnede en ny session til SQL Server, og jeg endnu ikke har opdateret en identitetskolonne under min nuværende session.

Nedenfor er en kode, der foretager nogle opdateringer af identitetskolonnen.

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                              |
+--------------------------------+

Her opretter jeg et par tabeller, indsætter nogle data og vælger derefter den aktuelle identitetsværdi.

Den aktuelle identitetsværdi er 2, fordi jeg indsatte to rækker i den tabel.

Lad os nu indsætte en række i den anden tabel:

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

Resultat:

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

Den returnerede værdi er 1, fordi det er den sidst indsatte identitetsværdi for denne session.

Eksempel 2 – Sammenlignet med IDENT_CURRENT()

Her sammenlignes 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ævnt, IDENT_CURRENT() returnerer sit resultat baseret på den angivne tabel. Derfor kan vi bruge den til at finde de sidste identitetsværdier for hver tabel.

Eksempel 3 – Skift til en ny session

Hvis jeg nu åbner en ny forbindelse og vælger @@IDENTITY igen, dette er hvad der sker:

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 er NULL, fordi jeg ikke har indsat noget i en identitetskolonne i den nye session.

IDENT_CURRENT() resultater er ikke NULL, fordi resultatet er baseret på tabellen – ikke sessionen.

@@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT()

Se IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY i SQL Server:Hvad er forskellen? for et simpelt eksempel, der gennemgår forskellene mellem disse tre funktioner.


  1. DATEDIFF() Returnerer forkerte resultater i SQL Server? Læs dette.

  2. Få en kolonne fra .sqlite, der indeholder flere tabeller med flere kolonner

  3. Hvordan bruger man global midlertidig tabel i Oracle-proceduren?

  4. MySQL-fejl 1153 - Fik en pakke større end 'max_allowed_packet' bytes