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 een tabel in de huidige sessie zijn gegenereerd. Echter, SCOPE_IDENTITY geeft waarden terug die alleen binnen het huidige bereik zijn ingevoegd; @@IDENTITY is niet beperkt tot een specifiek doelgebied.

Er zijn bijvoorbeeld twee tabellen, T1 en T2, en een INSERT trigger is 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 aan het einde van een INSERT statement op T1 verschillende waarden terug. @@IDENTITY geeft de laatste identiteitskolomwaarde terug die in elke scope in de huidige sessie is ingevoegd. Dit is de waarde die in T2 is ingevoegd. SCOPE_IDENTITY() geeft de waarde terug die in IDENTITY T1 is ingevoegd. Dit was de laatste inzet die in dezelfde scope plaatsvond. De functie SCOPE_IDENTITY() geeft de nullwaarde terug als de functie wordt aangeroepen voordat er statements INSERT 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. @@IDENTITY gebruiken 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. Gebruik van @@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)