Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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