SCOPE_IDENTITY (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Returnerar det senaste identitetsvärdet som infogats i en identitetskolumn i samma scope. Ett scope är en modul: en lagrad procedur, trigger, funktion eller batch. Därför, om två satser är i samma lagrade procedur, funktion eller batch, är de i samma scope.

Transact-SQL syntaxkonventioner

Syntax

SCOPE_IDENTITY()  

Returtyper

numerisk(38,0)

Anmärkningar

SCOPE_IDENTITY, IDENT_CURRENT och @@IDENTITY är liknande funktioner eftersom de returnerar värden som infogas i identitetskolumner.

IDENT_CURRENT är inte begränsad av omfattning och session; den är begränsad till en specificerad tabell. IDENT_CURRENT returnerar värdet som genererats för en specifik tabell i varje session och i varje scope. För mer information, se IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY och @@IDENTITY returnera de senaste identitetsvärdena som genereras i vilken tabell som helst i den aktuella sessionen. Dock returnerar SCOPE_IDENTITY värden som endast infogas inom den aktuella omfattningen; @@IDENTITY är inte begränsat till ett specifikt område.

Till exempel finns det två tabeller, T1 och T2, och en INSERT-trigger är definierad på T1. När en rad sätts in i T1 avfyras avtryckaren och sätter in en rad i T2. Detta scenario illustrerar två teleskop: insatsen på T1 och insatsen på T2 vid triggern.

Om vi antar att både T1 och T2 har identitetskolumner, returnerar @@IDENTITY och SCOPE_IDENTITY olika värden i slutet av en INSERT-sats på T1. @@IDENTITY returnerar värdet på den senaste identitetskolumnen som infogades över någon scope i den aktuella sessionen. Detta är värdet som infogas i T2. SCOPE_IDENTITY() returnerar värdet IDENTITY som satts in i T1. Detta var den sista insatsen som skedde i samma omfattning. Funktionen SCOPE_IDENTITY() returnerar nullvärdet om funktionen anropas innan några INSERT-satser i en identitetskolumn sker i scope.

Misslyckade satser och transaktioner kan ändra den aktuella identiteten för en tabell och skapa luckor i identitetskolumnens värden. Identitetsvärdet rullas aldrig tillbaka även om transaktionen som försökte infoga värdet i tabellen inte är committad. Till exempel, om ett INSERT-uttalande misslyckas på grund av ett IGNORE_DUP_KEY-brott, ökar fortfarande det aktuella identitetsvärdet för tabellen.

Examples

A. Att använda @@IDENTITY och SCOPE_IDENTITY med triggers

Följande exempel skapar två tabeller, TZ och TY, samt en INSERT-trigger på TZ. När en rad sätts in i tabellen TZ, avfyras triggern (Ztrig) och sätter in en rad i 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;  

Resultatuppsättning: Så här ser tabell-TZ ut.

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;  

Resultatuppsättning: Så här ser TY ut:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

Skapa triggern som infogar en rad i tabell TY när en rad infogas i tabell TZ.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

FYR triggern och bestäm vilka identitetsvärden du får med funktionerna @@IDENTITY och SCOPE_IDENTITY.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Här är resultatet.

/*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. Att använda @@IDENTITY och SCOPE_IDENTITY() med replikation

Följande exempel visar hur man använder @@IDENTITY och SCOPE_IDENTITY() för inserts i en databas som publiceras för merg-replikering. Båda tabellerna i exemplen finns i exempeldatabasen AdventureWorks2025 : Person.ContactType är inte publicerad, och Sales.Customer är publicerad. Sammanslagningsreplikering lägger till triggers till tabeller som publiceras. Därför @@IDENTITY kan värdet från insättningen returneras till en replikeringssystemtabell istället för insättningen i en användartabell.

Tabellen Person.ContactType har ett maximalt identitetsvärde på 20. Om du infogar en rad i tabellen @@IDENTITY och SCOPE_IDENTITY() returnerar samma värde.

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  

Här är resultatet.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Tabellen Sales.Customer har ett maximalt identitetsvärde på 29483. Om du infogar en rad i tabellen @@IDENTITY och SCOPE_IDENTITY() returnerar olika värden. SCOPE_IDENTITY() returnerar värdet från insättningen till användartabellen, medan @@IDENTITY returnerar värdet från insättningen till replikationssystemtabellen. Använd SCOPE_IDENTITY() för applikationer som kräver åtkomst till det insatta identitetsvärdet.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Här är resultatet.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Se även

@@IDENTITY (Transact-SQL)