Udostępnij za pomocą


@@IDENTITY (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

@@IDENTITY jest funkcją systemową, która zwraca ostatnią wartość identyczności.

Transact-SQL konwencje składni

Składnia

@@IDENTITY  

Typy zwracane

numeryczne(38,0)

Uwagi

Po INSERTzakończeniu , SELECT INTO, lub instrukcji masowej kopii, zawiera @@IDENTITY ostatnią wartość tożsamości generowaną przez to zdanie.

  • Jeśli zdanie nie wpływa na żadne tabele z kolumnami tożsamości, @@IDENTITY zwraca NULL.
  • Jeśli wstawi się wiele wierszy, generując wiele wartości @@IDENTITY tożsamości, zwraca się ostatnia wygenerowana wartość tożsamości.
  • Jeśli instrukcja wywoła jeden lub więcej wyzwalaczy, które wykonują wstawiania generujące wartości tożsamości, wywołanie @@IDENTITY natychmiast po instrukcji zwraca ostatnią wartość tożsamości wygenerowaną przez wyzwalacze.
  • Jeśli wyzwalacz zostanie wywołany po akcji wstawienia w tabeli zawierającej kolumnę tożsamości, a wyzwalacz wstawi się do innej tabeli, która nie ma kolumny tożsamości, @@IDENTITY zwraca wartość tożsamości z pierwszego wstawienia. Wartość @@IDENTITY nie wraca do poprzedniego ustawienia, jeśli INSERT instrukcja or SELECT INTO lub kopia zbiorcza nie ulegnie, albo jeśli transakcja zostanie cofnięta.

Nieudane wyciągi i transakcje mogą zmienić aktualną tożsamość tabeli i stworzyć luki w wartościach kolumn tożsamości. Wartość tożsamości nigdy nie jest cofana, nawet jeśli transakcja, która próbowała wprowadzić wartość do tabeli, nie została zatwierdzona. Na przykład, jeśli instrukcja INSERT nie zadziała z powodu IGNORE_DUP_KEY naruszenia, aktualna wartość tożsamości tabeli nadal jest zwiększona.

@@IDENTITY, SCOPE_IDENTITY, oraz IDENT_CURRENT są podobnymi funkcjami, ponieważ wszystkie zwracają ostatnią wartość wstawioną IDENTITY do kolumny tabeli.

  • @@IDENTITY oraz SCOPE_IDENTITY zwróć ostatnią wartość tożsamości wygenerowaną w dowolnej tabeli w bieżącej sesji. Jednak zwraca SCOPE_IDENTITY wartość tylko w obrębie bieżącego zakresu; @@IDENTITY nie jest ograniczony do konkretnego zakresu.

  • IDENT_CURRENT nie jest ograniczony zakresem i sesją; jest ograniczony do określonej tabeli. IDENT_CURRENT zwraca wartość tożsamości wygenerowaną dla konkretnej tabeli w dowolnej sesji i zakresie. Więcej informacji można znaleźć w IDENT_CURRENT (Transact-SQL).

Zakres @@IDENTITY funkcji to bieżąca sesja na lokalnym serwerze, na którym jest wykonywana. Funkcja ta nie może być stosowana do serwerów zdalnych ani połączonych. Aby uzyskać wartość tożsamości na innym serwerze, wykonaj procedurę przechowywaną na tym zdalnym lub połączonym serwerze i ta procedura przechowywana (działająca w kontekście zdalnego lub połączonego serwera) zebrała wartość tożsamości i zwróciła ją do wywołującego połączenia na lokalnym serwerze.

Replikacja może wpływać na wartość @@IDENTITY , ponieważ jest używana w wyzwalaczach replikacji i procedurach przechowywanych. @@IDENTITY nie jest wiarygodnym wskaźnikiem najnowszej tożsamości stworzonej przez użytkownika, jeśli kolumna jest częścią artykułu replikacyjnego. Możesz użyć składni SCOPE_IDENTITY() funkcji zamiast .@@IDENTITY Więcej informacji można znaleźć w SCOPE_IDENTITY (Transact-SQL)

Uwaga / Notatka

Wywołująca procedura przechowywana lub Transact-SQL polecenie musi zostać przepisane, aby używać funkcji SCOPE_IDENTITY() , która zwraca najnowszą tożsamość użytą w zakresie danego polecenia użytkownika, a nie tożsamość w zakresie zagnieżdżonego wyzwalacza używanego przez replikację.

Przykłady

Poniższy przykład wstawia wiersz do tabeli z kolumną identyczną (LocationID) i używa go @@IDENTITY do wyświetlania wartości tożsamości użytej w nowym wierszu.

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