Udostępnij za pośrednictwem


SCOPE_IDENTITY (Transact-SQL)

Zwraca ostatnią wartość tożsamości wstawiona do kolumna tożsamości w tym samym zakres.Zakres jest moduł: procedura przechowywana, wyzwalacza, funkcja lub partia. Dlatego są dwie instrukcje w tym samym zakres jeśli znajdują się w tej samej procedura przechowywana, funkcja lub partii.

Topic link iconKonwencje składni języka Transact-SQL

SCOPE_IDENTITY()

Zwracane typy

numeric(38,0)

Remarks

SCOPE_IDENTITY IDENT_CURRENT i @@ IDENTITY są podobne funkcje, ponieważ zwracały wartości, które są wstawiane do kolumny identyfikacji.

GIDIDENT_CURRENT zwraca wartość wygenerowana dla określonej tabela w każdej sesja i dowolnego zakres.Aby uzyskać więcej informacji zobaczIDENT_CURRENT (języka Transact-SQL).

SCOPE_IDENTITY i @@ IDENTITY zwracają ostatniej wartości tożsamości, które są generowane w dowolnej tabela w bieżącej sesja.Jednak SCOPE_IDENTITY zwraca wartości tylko w bieżącym zakresie, @@ IDENTITY nie jest ograniczony do określonego zakres.

Na przykład istnieją dwie tabele T1 i T2, a wyzwalacza WSTAWIENIA, jest zdefiniowana T1.Podczas wstawiania wiersza, w celu T1, wyzwalacz uruchomieniu i wstawia wiersz w T2.W tym scenariuszu pokazano dwóch zakresów: Wstaw na T1, a wstawienia w T2 przez wyzwalacz.

Zakładając, że zarówno T1 i T2 ma kolumny identyfikacji, @@ IDENTITY i SCOPE_IDENTITY zwracają różne wartości na końcu instrukcja INSERT na T1.@@ IDENTITY spowoduje przywrócenie ostatniego kolumna tożsamości wartości wstawione przez dowolnego zakres w bieżącej sesja.Jest to wartość wstawiane T2.SCOPE_IDENTITY() zwróci wartości tożsamości wstawiane T1.To jest ostatni wstawiania, który wystąpił w tej samej zakres.Funkcja SCOPE_IDENTITY() zwróci wartość null, jeśli funkcja jest wywoływana przed wystąpieniem żadnych instrukcji INSERT kolumna tożsamości w zakresie.

Instrukcje 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 kolumna.Wartość tożsamości nigdy nie jest wycofywany ponownie, mimo że w transakcji, który próbowano wstawić wartości do tabela nie jest zatwierdzona.Na przykład jeśli instrukcja INSERT nie powiedzie się z powodu naruszenia zasad 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

W poniższym przykładzie tworzone dwie tabele TZ i TY, a na wyzwalacza WSTAWIENIA TZ. Podczas wstawiania wiersza do tabela TZ, (wyzwalaczaZtrig) uruchomieniu i wstawia wiersz 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

Here is the result set.

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.Używanie @@ IDENTITY i SCOPE_IDENTITY() z replikacja

Następujące przykłady przedstawiają sposób korzystania z @@ IDENTITY i SCOPE_IDENTITY() dla wstawki w bazie danych, która zostanie opublikowana dla replikacja łączenia.Obie tabele w przykładach są AdventureWorks Przykładowa baza danych: Person.ContactType nie jest opublikowana, oraz Sales.Customer jest publikowana. replikacja łączenia dodaje wyzwalaczy do tabel, które są publikowane.Dlatego też @@IDENTITY może zwracać wartości z insert do tabela systemowa replikacja zamiast wstawiania do tabeli użytkownika.

The Person.ContactType tabela has a maximum identity value of 20. W przypadku wstawiania wiersza do tabela, @@IDENTITY i SCOPE_IDENTITY() zwraca taką samą wartość.

USE AdventureWorks;
GO
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager')
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO

Here is the result set.

SCOPE_IDENTITY
21

@@IDENTITY
21

The Sales.Customer tabela has a maximum identity value of 29483. If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return different values.SCOPE_IDENTITY() returns the value from the insert into the user table, whereas @@IDENTITY returns the value from the insert into the replication system table.Użycie SCOPE_IDENTITY() dla aplikacji, które wymagają dostępu do wartości wstawione tożsamości.

INSERT INTO Sales.Customer ([TerritoryID],[CustomerType]) VALUES (8,'S')
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO

Here is the result set.

SCOPE_IDENTITY
29484

@@IDENTITY
89

See Also

Reference