I SQL Server, hvis du nogensinde har brug for at returnere den værdi, der er oprettet i en identitetskolonne, har du flere muligheder. Hver af disse muligheder, selvom de ligner hinanden, gør en lidt anderledes ting.
Du kan især bruge følgende funktioner:
IDENT_CURRENT()
returnerer den sidst indsatte identitetsværdi for en given tabel.SCOPE_IDENTITY()
returnerer den sidste identitetsværdi, der er indsat i en identitetskolonne i enhver tabel i den aktuelle session og det aktuelle omfang.@@IDENTITY
returnerer den sidst indsatte identitetsværdi i enhver tabel i den aktuelle session, uanset omfang.
Eksempel
Her er et eksempel, der viser forskellen mellem disse tre funktioner.
Først skal du oprette to tabeller. Bemærk de forskellige seed- og stigningsværdier, der bruges til identitetskolonnen i hver tabel:
CREATE TABLE t1(id int IDENTITY(1,1)); CREATE TABLE t2(id int IDENTITY(150,10));
Opret nu en trigger, der indsætter en række i den anden tabel, hver gang en række indsættes i den første tabel:
CREATE TRIGGER t1_insert_trigger ON t1 FOR INSERT AS BEGIN INSERT t2 DEFAULT VALUES END;
Udløser brand i et andet omfang, så det er perfekt til mit eksempel her.
Indsæt data i den første tabel, og vælg derefter resultaterne fra begge tabeller:
INSERT t1 DEFAULT VALUES; SELECT id AS t1 FROM t1; SELECT id AS t2 FROM t2;
Resultat:
+------+ | t1 | |------| | 1 | +------+ (1 row affected) +------+ | t2 | |------| | 150 | +------+ (1 row affected)
Så bare for at være klar, blev disse data indsat af to forskellige omfang. Indsættet i t1 skete efter det nuværende omfang. Indsættet i t2 blev udført af triggeren, som kørte i et andet omfang.
Lad os nu vælge blandt de tidligere nævnte funktioner:
SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
Resultat:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | 150 | 1 | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
Resultatet returneret af @@IDENTITY
er ikke begrænset til omfang, og derfor returnerer den den sidst indsatte identitetsværdi, uanset omfang.
SCOPE_IDENTITY()
returnerer identitetsværdien fra den første tabel, fordi det var den sidst indsatte identitetsværdi inden for det aktuelle omfang (udløseren er uden for det aktuelle omfang).
IDENT_CURRENT()
funktion returnerer simpelthen den sidste identitetsværdi, der er indsat i den angivne tabel, uanset omfang eller session.
Åbn en ny session
Her er hvad der sker, hvis jeg åbner en ny session og kører den forrige sætning igen:
USE Test; SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
Resultat:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | NULL | NULL | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
Begge @@IDENTITY
og SCOPE_IDENTITY()
er NULL, fordi de kun returnerer resultater fra den aktuelle session. Jeg har ikke udført nogen identitetskolonneindsættelser i denne nye session, så jeg får NULL.
IDENT_CURRENT()
på den anden side returnerer det samme resultat som i det foregående eksempel, igen fordi dets resultater er baseret på den angivne tabel, uanset session eller omfang.