SCOPE_IDENTITY (Transact-SQL)
Zwraca ostatnią wartość tożsamości wstawiona do kolumna w ten sam zakres.zakres jest moduł: procedura składowana, wyzwalacz, funkcjalub partia.Dlatego dwie deklaracje są w ten sam zakres jeżeli są one w procedura składowana, funkcjalub partia.
Składnia
SCOPE_IDENTITY()
Zwracane typy
numeric(38,0)
Uwagi
SCOPE_IDENTITY, IDENT_CURRENT i @@ IDENTITY są podobne funkcje, ponieważ zwracały wartości, które są wstawiane do kolumny tożsamości.
IDENT_CURRENT nie jest ograniczone przez zakres i sesja; jest ograniczone do określonej tabela.IDENT_CURRENT zwraca wartość wygenerowana dla określonej tabela w sesja i dowolnego zakres.Aby uzyskać więcej informacji, zobacz IDENT_CURRENT (Transact-SQL).
SCOPE_IDENTITY i @@ IDENTITY zwracają ostatniej wartości tożsamości, które są generowane w dowolnej tabela w bieżącej sesja.SCOPE_IDENTITY zwraca jednak wartości wstawione tylko w obrębie bieżącego zakres; @@ IDENTITY nie jest ograniczony do określonego zakres.
Na przykład, istnieją dwie tabele, T1 i T2, i wyzwalacza WSTAWIENIA jest zdefiniowany na T1.Podczas wstawiania wiersza do T1, wyzwalacz fires i wstawia wiersz w T2.W tym scenariuszu ilustruje dwa zakresy: Wstaw na T1i Wstaw na T2 przez wyzwalacz.
Zakładając, że oba T1 i T2 kolumny tożsamości, @@ IDENTITY i będzie SCOPE_IDENTITY zwracają różne wartości po zakończeniu WSTAWIANIA instrukcja na T1.@@ IDENTITY zwróci ostatniej wartości kolumna tożsamości wstawione przez jakikolwiek zakres w bieżącej sesja.Jest to wartość wstawiana w T2.SCOPE_IDENTITY() zwróci wartość tożsamości wstawione w T1.To był ostatni Wstaw, który wystąpił w ten sam zakres.SCOPE_IDENTITY(), funkcja zwróci wartość null , jeśli funkcja jest wywoływana przed wystąpieniem żadnych instrukcji INSERT do kolumna w zakres.
Sprawozdania nie powiodło się i transakcje można zmienić bieżącej tożsamości dla tabela i utworzenie przerwy w tożsamości wartości w kolumna .Wartość tożsamości jest nigdy przywracane pomimo tego transakcja, która próba wstawienia wartości do tabela nie jest zatwierdzona.Na przykład jeśli INSERT instrukcja nie powiedzie się z powodu przekroczenia IGNORE_DUP_KEY, nadal jest zwiększany bieżącą wartość tożsamości dla tabela .
Przykłady
A.@@ IDENTITY i SCOPE_IDENTITY przy użyciu wyzwalaczy
Poniższy przykład tworzy dwie tabele, TZ i TYi wyzwalacza WSTAWIENIA na TZ.Podczas wstawiania wiersza do tabela TZ, wyzwalacz (Ztrig) fires 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')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla')
SELECT * FROM TZ
--Result set: This is how table TZ looks.
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')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator')
SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator
/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ.*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END
/*FIRE the trigger and determine what identity values you obtain
with the @@IDENTITY and SCOPE_IDENTITY functions.*/
INSERT TZ VALUES ('Rosalie')
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO
Oto zestaw wyników.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope. This was the insert on table TZ.*/
@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger. This fired because of an earlier insert on TZ.*/
B.Przy użyciu @@ IDENTITY i SCOPE_IDENTITY() z replikacja
Następujące przykłady przedstawiają metody korzystania @@IDENTITY i SCOPE_IDENTITY() dla wstawki w bazie danych, która jest publikowana replikacja scalająca.Obie tabele w przykładach są w AdventureWorks2008R2 przykładowej bazy danych: Person.ContactTypenie jest publikowana i Sales.Customer jest publikowany.Scalania replikacja dodaje wyzwalaczy do tabel, które są publikowane.W związku z tym @@IDENTITY może zwracać wartość Wstaw do replikacja tabela systemowa zamiast wstawiania do użytkownika tabela.
Person.ContactTypetabela ma tożsamość maksymalną wartość 20. Jeżeli wstawia wiersz do tabela @@IDENTITY i SCOPE_IDENTITY() zwraca te same wartości.
USE AdventureWorks2008R2;
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
Sales.Customertabela ma tożsamość maksymalną wartość 29483. Jeżeli wstawia wiersz do tabela @@IDENTITY i SCOPE_IDENTITY() zwracają różne wartości.SCOPE_IDENTITY()Zwraca wartość z Wstaw do użytkownika tabelanależy @@IDENTITY zwraca wartość Wstaw do replikacja tabela systemowa.Użycie SCOPE_IDENTITY() dla aplikacji, które wymagają dostępu do wartości wstawionego 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