Megosztás a következőn keresztül:


SCOPE_IDENTITY (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Visszaadja az utolsó identitásértéket, amelyet ugyanabban a scope-ban egy identitásoszlopba illesztettek. A scope egy modul: egy tárolt eljárás, trigger, funkció vagy kötet. Ezért, ha két állítás ugyanabban a tárolt eljárásban, függvényben vagy kötetben van, ugyanabban a hatókörben vannak.

Transact-SQL szintaxis konvenciók

Szemantika

SCOPE_IDENTITY()  

Visszatérési típusok

numeric(38,0)

Megjegyzések

Az SCOPE_IDENTITY, IDENT_CURRENT és @@IDENTITY hasonló függvények, mert olyan értékeket adnak vissza, amelyeket az identitásoszlopokba helyeznek.

IDENT_CURRENT nem korlátozódik a hatókörbe és az üléshez; egy meghatározott táblázatra korlátozódik. IDENT_CURRENT visszaadja az adott tábla által generált értéket bármely ülésen és bármely hatókörben. További információért lásd IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY és @@IDENTITY visszaadják az aktuális játék bármely táblájában generált utolsó identitásértékeket. Azonban SCOPE_IDENTITY csak az aktuális hatókörön belül beillesztett értékeket ad; @@IDENTITY nem korlátozódik egy adott hatókörre.

Például két tábla van, T1 és T2, és T1-en definiálva van egy INSERT trigger. Amikor egy sort behelyezünk a T1-be, a ravasz beindul, és egy sort helyez be a T2-be. Ez a helyzet két távcsövet illusztrál: a T1-es betétet és a T2-es betétet a ravasz mellett.

Feltételezve, hogy mind T1, mind T2 rendelkezik azonossági oszlopokkal, @@IDENTITY és SCOPE_IDENTITY eltérő értékeket adnak vissza egy INSERT utasítás végén T1-en. @@IDENTITY visszaadja az utolsó identitásoszlop értéket, amelyet bármely hatótávon beillesztettek az aktuális ülésszakban. Ez az érték, amelyet T2-ben illesztettek. SCOPE_IDENTITY() adja vissza a T1-be beillesztett IDENTITY értéket. Ez volt az utolsó betét, amely ugyanabban a távcsőben történt. Az SCOPE_IDENTITY() függvény akkor adja vissza a nullértéket, ha a függvényt meghívják, mielőtt bármely INSERT utasítás megjelenne egy identitásoszlopba a scope-ban.

A sikertelen utasítások és tranzakciók megváltoztathatják a tábla aktuális identitását, és réseket hozhatnak létre az identitásoszlop értékeiben. Az identitásérték soha nem fordul vissza, még akkor sem, ha az a tranzakció, amely megpróbálta beilleszteni az értéket a táblába, nem van kötelezve. Például, ha egy INSERT utasítás IGNORE_DUP_KEY megsértés miatt megbukik, a tábla aktuális identitásértéke továbbra is növelik.

Példák

A. @@IDENTITY és SCOPE_IDENTITY használata triggerekkel

A következő példa két táblát TZ hoz létre, és TY, valamint egy INSERT triggeret .TZ Amikor egy sort behelyezünk a táblábaTZ, a trigger (Ztrig) aktiválódik, és egy sort helyez be .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;  

Eredményhalmazom: Így néz ki a TZ tábla.

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;  

Eredményhalmaz: Így néz ki a TY:

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

Létrehozzuk azt a triggert, amely egy sort helyez be a TY táblába, amikor egy sort beillesztenek a TZ táblába.

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

Indítsd be a triggert, és határozd meg, milyen azonossági értékeket kapsz a @@IDENTITY és SCOPE_IDENTITY függvényekkel.

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

Itt van az eredmények összessége.

/*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. @@IDENTITY és SCOPE_IDENTITY() használata replikációval

Az alábbi példák bemutatják, hogyan lehet @@IDENTITY használni és SCOPE_IDENTITY() beillesztést egy olyan adatbázisban, amelyet az egyesítés replikációhoz publikálnak. Mindkét táblázat a példákban a AdventureWorks2025 mintaadatbázisban található: Person.ContactType nem publikálják, és Sales.Customer közzéteszik. Az egyesülés replikáció triggereket ad a közzétett táblákhoz. Ezért @@IDENTITY vissza lehet térni az értéket a beszúrásból egy replikációs rendszer táblába a felhasználói tábla helyett.

A Person.ContactType táblázat maximális azonossági értéke 20. Ha egy sort beillesztesz a táblázatba @@IDENTITY , és SCOPE_IDENTITY() ugyanazt az értéket adod vissza.

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  

Itt van az eredmények összessége.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

A Sales.Customer táblázat maximális azonossági értéke 29483. Ha egy sort beviszel a táblázatba @@IDENTITY , és SCOPE_IDENTITY() különböző értékeket adsz vissza. SCOPE_IDENTITY() visszaadja az értéket az insekélésből a felhasználói táblába, míg @@IDENTITY az értéket az insertből a replikációs rendszer táblájába viszi. Olyan alkalmazások használata SCOPE_IDENTITY() , amelyek hozzáférést igényelnek a beillesztett identitásértékhez.

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

Itt van az eredmények összessége.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Lásd még:

@@IDENTITY (Transact-SQL)