SCOPE_IDENTITY (Transact-SQL)

Aynı kapsamdaki bir kimlik sütununa eklenmiş son kimlik değerini döndürür. Bir kapsam bir modüldür: saklı bir yordam, bir tetik, bir işlev veya toplu bir iştir. Dolayısıyla iki deyim aynı saklı yordamda, işlevde veya toplu işteyse, aynı kapsamdadır.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

SCOPE_IDENTITY()

Dönüş Türleri

numeric(38,0)

Açıklamalar

SCOPE_IDENTITY, IDENT_CURRENT ve @@IDENTITY, kimlik sütunlarına eklenen değerleri döndürdüklerinden benzer işlevlerdir.

IDENT_CURRENT kapsam veya oturumla sınırlı değildir; belirli bir tablo ile sınırlıdır. IDENT_CURRENT, herhangi bir oturumda ve herhangi bir kapsamda belirli bir tablo için üretilen değeri döndürür. Daha fazla bilgi için, bkz. IDENT_CURRENT (Transact-sql).

SCOPE_IDENTITY ve @@IDENTITY, geçerli oturumda herhangi bir tabloda üretilen en son kimlik değerini döndürür. Ancak SCOPE_IDENTITY, yalnızca geçerli kapsam içinde eklenmiş değerleri döndürür; @@IDENTITY belirli bir kapsamla sınırlı değildir.

Örneğin, T1 ve T2 adı iki tablo olsun ve T1 üzerinde bir INSERT tetikleyicisi tanımlanmış olsun. T1 tablosuna bir satır eklendiğinde, tetikleyici çalışır ve T2 tablosuna bir satır ekler. Bu senaryo iki kapsamı göstermektedir: T1 üzerindeki ekleme işlemi ve T2 üzerinde tetikleyici tarafından gerçekleştirilen ekleme işlemi.

Hem T1 hem de T2 tablosunun kimlik sütunları olduğunu varsayarsak, @@IDENTITY ve SCOPE_IDENTITY, T1 üzerinde çalıştırılan bir INSERT deyiminin sonunda farklı değerler döndürür. @@IDENTITY geçerli oturumdaki tüm kapsamlarda eklenen son kimlik sütunu değerini döndürür. Bu, T2 tablosuna eklenen değerdir. SCOPE_IDENTITY(), T1 tablosuna eklenen IDENTITY değerini döndürür. Bu, aynı kapsamda gerçekleşmiş son ekleme işlemidir. SCOPE_IDENTITY() kapsam içindeki bir kimlik sütununda bir INSERT deyimi kullanılmadan çağrılırsa, işlev null değerini döndürür.

Hata döndüren deyimler ve işlemler bir tablonun geçerli kimliğini değiştirebilir ve kimlik sütunu değerlerinde boşluklar oluşturabilir. Kimlik değerini tabloya eklemeye çalışan işlem yürütülmemiş olsa bile kimlik değeri hiçbir zaman geri alınmaz. Örneğin, bir INSERT deyimi bir IGNORE_DUP_KEY ihlali nedeniyle hata verirse, tablonun geçerli kimlik değeri yine de artırılır.

Örnekler

A.@@IDENTITY ve SCOPE_IDENTITY işlevlerini tetikleyiciler ile kullanma

Aşağıdaki örnek, TZ ve TY adlı iki tablo ve TZ tablosu üzerinde INSERT tetikleyicisi oluşturmaktadır. TZ tablosuna bir satır eklendiğinde, (Ztrig) tetikleyicisi çalışır ve TY tablosuna bir satır ekler.

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.

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:

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

/*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

Sonuç kümesi buradadır.

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.@@IDENTITY ve SCOPE_IDENTITY() işlevlerini çoğaltma ile kullanma

Aşağıdaki örnekler, @@IDENTITY ve SCOPE_IDENTITY() işlevlerinin birleştirme çoğaltması için yayımlanmış bir veritabanına satır eklemek için nasıl kullanılacağını göstermektedir. Örneklerdeki her iki tablo da AdventureWorks2012 örnek veritabanındadır: Person.ContactType yayımlanmamış, Sales.Customer yayımlanmıştır. Birleştirme çoğaltması yayımlanmış tablolara tetikleyiciler ekler. Dolayısıyla @@IDENTITY, bir kullanıcı tablosuna yapılan ekleme yerine çoğaltma sistem tablosuna yapılan eklemenin değerini döndürebilir.

Person.ContactType tablosunun en yüksek kimlik değeri 20'dir. Tabloya bir satır eklerseniz, @@IDENTITY ve SCOPE_IDENTITY() aynı değeri döndürür.

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

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

Sonuç kümesi buradadır.

SCOPE_IDENTITY

21

@@IDENTITY

21

Sales.Customer tablosunun en yüksek kimlik değeri 29483'dir. Tabloya bir satır eklerseniz, @@IDENTITY ve SCOPE_IDENTITY() farkı değerler döndürür. SCOPE_IDENTITY() kullanıcı tablosuna yapılan eklemenin değerini, @@IDENTITY ise çoğaltma sistem tablosuna yapılan eklemenin değerini döndürür. Eklenen kimlik değerine erişim gerektiren uygulamalar için SCOPE_IDENTITY() kullanın.

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

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

Sonuç kümesi buradadır.

SCOPE_IDENTITY

29484

@@IDENTITY

89

Ayrıca bkz.

Başvuru

@@ IDENTITY (Transact-sql)