Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza 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