@@IDENTITY (Transact-SQL)

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

@@IDENTITY är en systemfunktion som returnerar det senast insatta identitetsvärdet.

Transact-SQL syntaxkonventioner

Syntax

@@IDENTITY  

Returtyper

numerisk(38,0)

Anmärkningar

Efter att ett INSERT, SELECT INTO, eller masskopierings-uttalande är klart, @@IDENTITY innehåller det det sista identitetsvärdet som genereras av satsen.

  • Om satsen inte påverkade några tabeller med identitetskolumner, @@IDENTITY returnerar NULL.
  • Om flera rader infogas, vilket genererar flera identitetsvärden, @@IDENTITY returnerar det senaste identitetsvärdet som genereras.
  • Om satsen utlöser en eller flera triggers som utför insättningar som genererar identitetsvärden, returnerar anrop @@IDENTITY omedelbart efter uttalandet det senaste identitetsvärdet som genererats av triggers.
  • Om en trigger utlöses efter en insättningsåtgärd i en tabell som har en identitetskolumn, och triggern infogas i en annan tabell som inte har någon identitetskolumn, @@IDENTITY returnerar identitetsvärdet för den första insättningen. Värdet @@IDENTITY återgår inte till en tidigare inställning om or-satsen INSERTSELECT INTO eller bulkkopian misslyckas, eller om transaktionen rullas tillbaka.

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.

@@IDENTITY, SCOPE_IDENTITY, och IDENT_CURRENT är liknande funktioner eftersom de alla returnerar det sista värdet som satts in i kolumnen IDENTITY i en tabell.

  • @@IDENTITY och SCOPE_IDENTITY returnera det senaste identitetsvärdet som genererats i någon tabell i den aktuella sessionen. Dock returnerar SCOPE_IDENTITY värdet endast inom den aktuella omfattningen; @@IDENTITY är inte begränsad till ett specifikt omfång.

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

Funktionen är den @@IDENTITY aktuella sessionen på den lokala server där den körs. Denna funktion kan inte tillämpas på fjärrservrar eller länkade servrar. För att erhålla ett identitetsvärde på en annan server, kör en lagrad produr på den fjärranslutna eller länkade servern och låt den lagrade proceduren (som körs i kontexten av den fjärranslutna eller länkade servern) samla in identitetsvärdet och returnera det till den anropande anslutningen på den lokala servern.

Replikering kan påverka värdet @@IDENTITY , eftersom det används inom replikationstriggers och lagrade procedurer. @@IDENTITY är inte en tillförlitlig indikator på den senaste användarskapade identiteten om kolumnen ingår i en replikationsartikel. Du kan använda SCOPE_IDENTITY() funktionssyntaxen istället för @@IDENTITY. För mer information, se SCOPE_IDENTITY (Transact-SQL)

Anmärkning

Den anropande lagrade proceduren eller Transact-SQL-satsen måste skrivas om för att använda SCOPE_IDENTITY() funktionen, som returnerar den senaste identiteten som användes inom användarsatsens omfattning, och inte identiteten inom omfattningen av den nästlade triggern som används vid replikering.

Examples

Följande exempel infogar en rad i en tabell med en identitetskolumn (LocationID) och använder @@IDENTITY det för att visa identitetsvärdet som används i den nya raden.

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