Delen via


@@IDENTITY (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

@@IDENTITY is een systeemfunctie die de laatst ingevoegde identiteitswaarde teruggeeft.

Transact-SQL syntaxis-conventies

Syntaxis

@@IDENTITY  

Retourtypen

numeriek(38,0)

Opmerkingen

Nadat een , SELECT INTO, of bulk copy statement is voltooid, @@IDENTITY bevat het INSERTde laatste identiteitswaarde die door de instructie wordt gegenereerd.

  • Als de instructie geen enkele tabel met identiteitskolommen beïnvloedde, @@IDENTITY geeft NULL.
  • Als meerdere rijen worden ingevoegd, die meerdere identiteitswaarden genereren, @@IDENTITY geeft de laatst gegenereerde identiteitswaarde terug.
  • Als de instructie één of meer triggers activeert die inserts uitvoeren die identiteitswaarden genereren, geeft direct na de instructie aanroepen @@IDENTITY de laatste identiteitswaarde terug die door de triggers is gegenereerd.
  • Als een trigger wordt afgevuurd na een invoegactie op een tabel met een identiteitskolom, en de trigger wordt ingevoegd in een andere tabel zonder identiteitskolom, @@IDENTITY geeft de identiteitswaarde van de eerste invoeging terug. De @@IDENTITY waarde keert niet terug naar een eerdere instelling als de INSERT or-instructie SELECT INTO of bulkkopie faalt, of als de transactie wordt teruggerold.

Mislukte statements en transacties kunnen de huidige identiteit van een tabel veranderen en gaten creëren in de identiteitskolomwaarden. De identiteitswaarde wordt nooit teruggerold, ook al is de transactie die probeerde de waarde in de tabel in te voegen niet committed. Als bijvoorbeeld een INSERT-instructie faalt door een IGNORE_DUP_KEY overtreding, wordt de huidige identiteitswaarde voor de tabel nog steeds verhoogd.

@@IDENTITY, SCOPE_IDENTITY, en IDENT_CURRENT zijn vergelijkbare functies omdat ze allemaal de laatst ingevoerde waarde in de IDENTITY kolom van een tabel teruggeven.

  • @@IDENTITY en SCOPE_IDENTITY geef de laatst gegenereerde identiteitswaarde terug in een tabel in de huidige sessie. Echter, SCOPE_IDENTITY de waarde wordt alleen binnen de huidige scope teruggegeven; @@IDENTITY is niet beperkt tot een specifieke scope.

  • IDENT_CURRENT is niet beperkt door reikwijdte en sessie; het is beperkt tot een gespecificeerde tabel. IDENT_CURRENT geeft de identiteitswaarde terug die voor een specifieke tabel in elke sessie en elke scope is gegenereerd. Voor meer informatie, zie IDENT_CURRENT (Transact-SQL).

De scope van de @@IDENTITY functie is de huidige sessie op de lokale server waarop deze wordt uitgevoerd. Deze functie kan niet worden toegepast op externe of gekoppelde servers. Om een identiteitswaarde op een andere server te verkrijgen, voer je een opgeslagen procedure uit op die externe of gekoppelde server en laat die opgeslagen procedure (die wordt uitgevoerd in de context van de externe of gekoppelde server) de identiteitswaarde verzamelen en terugsturen naar de aanroepende verbinding op de lokale server.

Replicatie kan de @@IDENTITY waarde beïnvloeden, omdat deze wordt gebruikt binnen de replicatietriggers en opgeslagen procedures. @@IDENTITY is geen betrouwbare indicator van de meest recente door de gebruiker aangemaakte identiteit als de kolom deel uitmaakt van een replicatieartikel. Je kunt de SCOPE_IDENTITY() functiesyntaxis gebruiken in plaats van @@IDENTITY. Voor meer informatie, zie SCOPE_IDENTITY (Transact-SQL)

Opmerking

De aanroepende stored procedure of Transact-SQL-instructie moet worden herschreven om de SCOPE_IDENTITY() functie te gebruiken, die de meest recente identiteit teruggeeft die binnen het bereik van die user statement is gebruikt, en niet de identiteit binnen de scope van de geneste trigger die door replicatie wordt gebruikt.

Voorbeelden

Het volgende voorbeeld voegt een rij in in een tabel met een identiteitskolom (LocationID) en gebruikt @@IDENTITY om de identiteitswaarde in de nieuwe rij weer te geven.

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