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.
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