Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Geeft de laatst ingevoerde identiteitswaarde terug in een identiteitskolom in dezelfde scope. Een scope is een module: een opgeslagen procedure, trigger, functie of batch. Daarom, als twee statements in dezelfde opgeslagen procedure, functie of batch zitten, vallen ze in dezelfde scope.
Transact-SQL syntaxis-conventies
Syntaxis
SCOPE_IDENTITY()
Retourtypen
numeriek(38,0)
Opmerkingen
SCOPE_IDENTITY, IDENT_CURRENT en @@IDENTITY zijn vergelijkbare functies omdat ze waarden teruggeven die in identiteitskolommen worden ingevoegd.
IDENT_CURRENT is niet beperkt door reikwijdte en sessie; het is beperkt tot een gespecificeerde tabel. IDENT_CURRENT geeft de waarde terug die voor een specifieke tabel in elke sessie en elke scope is gegenereerd. Voor meer informatie, zie IDENT_CURRENT (Transact-SQL).
SCOPE_IDENTITY en @@IDENTITY geven de laatste identiteitswaarden terug die in elke tabel in de huidige sessie worden gegenereerd. Echter, SCOPE_IDENTITY geeft waarden terug die alleen binnen het huidige bereik zijn ingevoegd; @@IDENTITY beperkt zich niet tot een specifieke scope.
Er zijn bijvoorbeeld twee tabellen, T1 en T2, en is een INSERT-trigger gedefinieerd op T1. Wanneer een rij op T1 wordt geplaatst, wordt de trekker afgevuurd en plaatst een rij in T2. Dit scenario illustreert twee scopes: de insert op T1 en de insert op T2 bij de trigger.
Aangenomen dat zowel T1 als T2 identiteitskolommen hebben, geven @@IDENTITY en SCOPE_IDENTITY verschillende waarden terug aan het einde van een INSERT-instructie op T1. @@IDENTITY geeft de laatste identiteitskolomwaarde terug die is ingevoegd in elke scope in de huidige sessie. Dit is de waarde die in T2 is ingevoegd. SCOPE_IDENTITY() geeft de IDENTITY-waarde terug die in T1 is ingevoegd. Dit was de laatste inzet die in dezelfde scope plaatsvond. De SCOPE_IDENTITY()-functie geeft de nullwaarde terug als de functie wordt aangeroepen voordat er INSERT-instructies in een identiteitskolom in de scope plaatsvinden.
Mislukte statements en transacties kunnen de huidige identiteit van een tabel veranderen en gaten creëren in de identiteitskolomwaarden. De identiteitswaarde wordt nooit teruggerold, ook al is de transactie die probeerde de waarde in de tabel in te voegen niet committed. Als bijvoorbeeld een INSERT-instructie faalt door een IGNORE_DUP_KEY-overtreding, wordt de huidige identiteitswaarde voor de tabel nog steeds verhoogd.
Voorbeelden
Eén. Het gebruik van @@IDENTITY en SCOPE_IDENTITY met triggers
Het volgende voorbeeld creëert twee tabellen, TZ en TY, en een INSERT-trigger op TZ. Wanneer een rij in tabel TZwordt ingevoegd, vuurt de trekker (Ztrig) af en voegt een rij in TY.
USE tempdb;
GO
CREATE TABLE TZ (
Z_id INT IDENTITY(1,1)PRIMARY KEY,
Z_name VARCHAR(20) NOT NULL);
INSERT TZ
VALUES ('Lisa'),('Mike'),('Carla');
SELECT * FROM TZ;
Resultaatset: Zo ziet tafel TZ eruit.
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla
CREATE TABLE TY (
Y_id INT IDENTITY(100,5)PRIMARY KEY,
Y_name VARCHAR(20) NULL);
INSERT TY (Y_name)
VALUES ('boathouse'), ('rocks'), ('elevator');
SELECT * FROM TY;
Resultaatset: Zo ziet TY eruit:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator
Maak de trigger aan die een rij invoegt in tabel TY wanneer een rij in tabel TZ wordt ingevoegd.
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END;
FIRE de trigger en bepaal welke identiteitswaarden je krijgt met de @@IDENTITY- en SCOPE_IDENTITY functies.
INSERT TZ VALUES ('Rosalie');
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Hier is het resultatenoverzicht.
/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`
SCOPE_IDENTITY
4
/*@@IDENTITY returns the last identity value inserted to TY by the trigger.
This fired because of an earlier insert on TZ.*/
@@IDENTITY
115
B. Met @@IDENTITY en SCOPE_IDENTITY() met replicatie
De volgende voorbeelden tonen hoe je en @@IDENTITY voor inserts gebruikt SCOPE_IDENTITY() in een database die is gepubliceerd voor merge-replicatie. Beide tabellen in de voorbeelden bevinden zich in de AdventureWorks2025 voorbeelddatabase: Person.ContactType is niet gepubliceerd, en Sales.Customer is gepubliceerd. Merge-replicatie voegt triggers toe aan tabellen die worden gepubliceerd. Daarom @@IDENTITY kan de waarde van de insert teruggeven in een replicatiesysteemtabel in plaats van de insert in een gebruikerstabel.
De Person.ContactType tabel heeft een maximale identiteitswaarde van 20. Als je een rij in de tabel invoegt @@IDENTITY en SCOPE_IDENTITY() dezelfde waarde teruggeeft.
USE AdventureWorks2022;
GO
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Hier is het resultatenoverzicht.
SCOPE_IDENTITY
21
@@IDENTITY
21
De Sales.Customer tabel heeft een maximale identiteitswaarde van 29483. Als je een rij in de tabel invoegt @@IDENTITY en SCOPE_IDENTITY() verschillende waarden teruggeeft.
SCOPE_IDENTITY() geeft de waarde van de insert terug in de gebruikerstabel, terwijl @@IDENTITY de waarde van de insert teruggeeft aan de replicatiesysteemtabel. Gebruik SCOPE_IDENTITY() voor applicaties die toegang tot de ingevoegde identiteitswaarde vereisen.
INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Hier is het resultatenoverzicht.
SCOPE_IDENTITY
29484
@@IDENTITY
89