Udostępnij za pomocą


SCOPE_IDENTITY (Transact-SQL)

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

Zwraca ostatnią wartość tożsamości wstawioną do kolumny tożsamości w tym samym zakresie. Teleskop to moduł: procedura przechowywana, wyzwalacz, funkcja lub partia. Dlatego jeśli dwa stwierdzenia są w tej samej procedurze przechowywanej, funkcji lub partii, są w tym samym zakresie.

Transact-SQL konwencje składni

Składnia

SCOPE_IDENTITY()  

Typy zwracane

numeryczne(38,0)

Uwagi

SCOPE_IDENTITY, IDENT_CURRENT i @@IDENTITY są podobnymi funkcjami, ponieważ zwracają wartości wstawiane do kolumn tożsamości.

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

SCOPE_IDENTITY i @@IDENTITY zwracają ostatnie wartości tożsamości generowane w dowolnej tabeli w bieżącej sesji. Jednak SCOPE_IDENTITY zwraca wartości wstawione tylko w obecnym zakresie; @@IDENTITY nie ogranicza się do konkretnego zakresu.

Na przykład istnieją dwie tabele, T1 i T2, a na T1 zdefiniowany jest wyzwalacz INSERT. Gdy wiersz zostanie włożony do T1, spust uruchamia się i wstawia rząd w T2. Ten scenariusz ilustruje dwa lunety: wkład na T1 oraz wkład na T2 przy spustu.

Zakładając, że zarówno T1, jak i T2 mają kolumny tożsamości, @@IDENTITY i SCOPE_IDENTITY zwracają różne wartości na końcu instrukcji INSERT na T1. @@IDENTITY zwraca ostatnią wartość kolumny tożsamości wprowadzoną w dowolnym zakresie w bieżącej sesji. To jest wartość wprowadzona w T2. SCOPE_IDENTITY() zwraca wartość IDENTITY wprowadzoną w T1. To była ostatnia wstawka, która pojawiła się w tym samym teleskopie. Funkcja SCOPE_IDENTITY() zwraca wartość null, jeśli funkcja zostanie wywołana przed wystąpieniem jakichkolwiek instrukcji INSERT w kolumnie tożsamości w zakresie.

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 naruszenia IGNORE_DUP_KEY, aktualna wartość tożsamości tabeli nadal jest zwiększona.

Przykłady

A. Używam @@IDENTITY i SCOPE_IDENTITY z triggerami

Poniższy przykład tworzy dwie tabele, TZ oraz TY, oraz wyzwalacz INSERT na TZ. Gdy wiersz jest wstawiany do tabeli TZ, wyzwalacz (Ztrig) uruchamia się i wstawia wiersz w .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;  

Zestaw wyników: Tak wygląda tabela TZ.

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;  

Zestaw wyników: Tak wygląda TY:

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

Stwórz wyzwalacz, który wstawia wiersz w tabeli TY, gdy wiersz zostanie wstawiony w tabeli TZ.

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

FIRE trigger i określ, jakie wartości tożsamości uzyskasz za pomocą funkcji @@IDENTITY i SCOPE_IDENTITY.

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

Oto zestaw wyników.

/*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. Używając @@IDENTITY i SCOPE_IDENTITY() z replikacją

Poniższe przykłady pokazują, jak używać @@IDENTITYSCOPE_IDENTITY() i używać insertów w bazie danych publikowanej do replikacji merge. Obie tabele w przykładach znajdują się w przykładowej bazie AdventureWorks2025 danych: Person.ContactType nie jest publikowana i Sales.Customer jest publikowana. Replikacja scalania dodaje wyzwalacze do tabel, które są publikowane. Dlatego można @@IDENTITY zwracać wartość z insertu do tabeli systemu replikacyjnego zamiast z insertu do tabeli użytkownika.

Tabela Person.ContactType ma maksymalną wartość tożsamości 20. Jeśli włożysz wiersz do tabeli i zwrócisz @@IDENTITYSCOPE_IDENTITY() tę samą wartość.

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  

Oto zestaw wyników.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Tabela Sales.Customer ma maksymalną wartość tożsamościową 29483. Jeśli włożysz wiersz do tabeli i zwrócisz @@IDENTITYSCOPE_IDENTITY() różne wartości. SCOPE_IDENTITY() zwraca wartość z insertu do tabeli użytkownika, natomiast @@IDENTITY wartość z insertu do tabeli systemu replikacyjnego. Zastosowanie SCOPE_IDENTITY() w aplikacjach wymagających dostępu do wprowadzonej wartości tożsamości.

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

Oto zestaw wyników.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Zobacz też

@@IDENTITY (Transact-SQL)