Udostępnij za pośrednictwem


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.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

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

Zobacz także

Odwołanie