Delen via


SCOPE_IDENTITY (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-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

Zie ook

@@IDENTITY (Transact-SQL)