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


@@IDENTITY (Transact-SQL)

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

@@IDENTITY egy rendszerfüggvény, amely az utoljára beillesztett identitásértéket adja vissza.

Transact-SQL szintaxis konvenciók

Szemantika

@@IDENTITY  

Visszatérési típusok

numeric(38,0)

Megjegyzések

Miután egy INSERT, SELECT INTO, vagyis tömeges másolási utasítás teljesül, @@IDENTITY tartalmazza az utasítás által generált utolsó identitásértéket.

  • Ha az utasítás nem érint egyetlen azonosító oszlopos táblát is, @@IDENTITY akkor -t adnak vissza NULL.
  • Ha több sort is beillesztünk, és több identitásértéket generálunk, @@IDENTITY az utolsó generált identitásérték jelenik meg.
  • Ha az utasítás egy vagy több triggert indít, amelyek beillesztéseket hajtanak végre, és identitásértékeket generálnak, akkor a kijelentés utáni hívás @@IDENTITY visszaadja az utolsó azonosító értéket, amelyet a triggerek generáltak.
  • Ha egy trigger egy beillesztési művelet után aktiválódik egy olyan táblán, amelynek van identitásoszlopa, és a trigger egy másik táblába kerül, amelynek nincs identitásoszlopa, akkor @@IDENTITY az első beszúrás identitásértékét adja vissza. Az @@IDENTITY érték nem tér vissza korábbi beállításra, ha az INSERT or SELECT INTO utasítás vagy a tömeges másolat sikertelenül működik, vagy ha a tranzakciót visszafordítják.

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 megsértés miatt megbukik IGNORE_DUP_KEY , a tábla aktuális identitásértéke továbbra is növelve marad.

@@IDENTITY, SCOPE_IDENTITY, és IDENT_CURRENT hasonló függvények, mert mindegyikük visszaadja az utolsó értéket, amelyet egy IDENTITY tábla oszlopába helyeztek be.

  • @@IDENTITY és SCOPE_IDENTITY visszaadja az aktuális ülés bármely táblájában generált utolsó identitásértéket. Azonban az SCOPE_IDENTITY érték csak a jelenlegi hatókörön belül adja vissza; @@IDENTITY nem korlátozódik egy adott hatókörre.

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

A @@IDENTITY függvény hatóköre a helyi szerveren zajló aktuális munkamenet, ahol végrehajtják. Ez a funkció nem alkalmazható távoli vagy összekapcsolt szerverekre. Egy másik szerveren identitásérték megszerzéséhez hajtsunk végre egy tárolt eljárást azon a távoli vagy összekapcsolt szerveren, és az a tárolt eljárás (amely a távoli vagy kapcsolt szerver kontextusában fut) összegyűjti az identitásértéket, majd visszaküldi a helyi szerver hívó kapcsolatára.

A replikáció befolyásolhatja az @@IDENTITY értéket, mivel a replikációs triggerekben és tárolt eljárásokban használják. @@IDENTITY nem megbízható mutatója a legfrissebb felhasználó által létrehozott identitásnak, ha az oszlop egy replikációs cikk része. Használhatod a SCOPE_IDENTITY() függvényszintaxist a @@IDENTITYhelyett. További információért lásd SCOPE_IDENTITY (Transact-SQL)

Megjegyzés:

A hívó tárolt eljárást vagy Transact-SQL utasítást újra kell írni, hogy használja a SCOPE_IDENTITY() függvényt, amely a felhasználói utasítás hatókörén belül használt legfrissebb identitást adja vissza, nem pedig a replikáció által használt beágyazott trigger hatókörű identitását.

Példák

A következő példa egy sort helyez be egy táblázatba egy identitásoszloptal (LocationID), és ezt használja @@IDENTITY az új sorban használt identitásérték megjelenítésére.

USE AdventureWorks2022;  
GO  
--Display the value of LocationID in the last row in the table.  
SELECT MAX(LocationID) FROM Production.Location;  
GO  
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)  
VALUES ('Damaged Goods', 5, 2.5, GETDATE());  
GO  
SELECT @@IDENTITY AS 'Identity';  
GO  
--Display the value of LocationID of the newly inserted row.  
SELECT MAX(LocationID) FROM Production.Location;  
GO