Aracılığıyla paylaş


SCOPE_IDENTITY (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Aynı kapsamda bir kimlik sütununa eklenen son kimlik değerini döndürür. Bir kapsam bir modüldür: saklanan bir prosedür, tetikleyici, fonksiyon veya toplu bir grup. Bu nedenle, iki ifade aynı depolanmış prosedürde, fonksiyonda veya toplu sistemde ise, aynı kapsamdadırlar.

Transact-SQL söz dizimi 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ükleri için benzer fonksiyonlardır.

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

SCOPE_IDENTITY ve @@IDENTITY, mevcut oturumdaki herhangi bir tabloda oluşturulan son kimlik değerlerini döndürür. Ancak, SCOPE_IDENTITY yalnızca mevcut kapsam içinde eklenen değerleri döndürür; @@IDENTITY belirli bir kapsamla sınırlı değildir.

Örneğin, T1 ve T2 olmak üzere iki tablo vardır ve T1 üzerinde bir INSERT tetikleyicisi tanımlanır. Bir satır T1'e eklendiğinde, tetikleyici ateşlenir ve T2'ye bir satır yerleştirir. Bu senaryo iki dürbünü gösterir: T1'deki insert ve tetik yanındaki T2'deki yerleştirme.

T1 ve T2'nin hem kimlik sütunlarına sahip olduğunu varsayarsak, @@IDENTITY ve SCOPE_IDENTITY T1'deki INSERT ifadesinin sonunda farklı değerler döndürür. @@IDENTITY, mevcut oturumda herhangi bir kapsamda eklenen son kimlik sütunu değerini döndürür. Bu, T2'ye eklenen değerdir. SCOPE_IDENTITY() T1'e eklenen IDENTITY değerini döndürür. Bu, aynı dürbünde gerçekleşen son girişti. SCOPE_IDENTITY() fonksiyonu, kapsamda herhangi bir INSERT ifadesi bir kimlik sütununa girmeden önce çağrıldığında null değeri döndürür.

Başarısız ifadeler ve işlemler, bir tablonun mevcut kimliğini değiştirebilir ve kimlik sütunu değerlerinde boşluklar yaratabilir. Kimlik değeri, değeri tabloya eklemeye çalışan işlem belirlenmemiş olsa bile asla geri alınmaz. Örneğin, bir INSERT ifadesi IGNORE_DUP_KEY ihlali nedeniyle başarısız olursa, tablonun mevcut kimlik değeri yine artırılır.

Örnekler

A. @@IDENTITY ve tetikleyicilerle SCOPE_IDENTITY kullanmak

Aşağıdaki örnek iki tablo TZ oluşturur, ve TY, ve üzerinde TZbir INSERT tetikleyicisi oluşturur. Bir satır tabloya TZeklendiğinde, tetikleyici (Ztrig) ateşlenir ve içine TYbir 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'),('Mike'),('Carla');  
  
SELECT * FROM TZ;  

Sonuç seti : Tablo TZ böyle görünüyor.

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'), ('rocks'), ('elevator');  
  
SELECT * FROM TY;  

Sonuç seti : TY böyle görünüyor:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

TZ tablosuna satır eklendiğinde TY tablosuna satır ekleyen tetikleyiciyi oluşturun.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

Tetikleyiciyi ATEŞLE ve @@IDENTITY ile SCOPE_IDENTITY fonksiyonlarıyla hangi kimlik değerlerini elde ettiğini belirleyin.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Sonuç kümesi aşağıdadır.

/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`  
SCOPE_IDENTITY  
4  

/*@@IDENTITY returns the last identity value inserted to TY by the trigger. 
  This fired because of an earlier insert on TZ.*/
@@IDENTITY  
115  

B. @@IDENTITY ve SCOPE_IDENTITY() ile çoğaltma ile

Aşağıdaki örnekler, birleştirme çoğaltımı için yayımlanan bir veritabanında nasıl ve eklemelerin nasıl kullanılacağını @@IDENTITYSCOPE_IDENTITY() gösterir. Örneklerdeki AdventureWorks2025 her iki tablo da örnek veritabanındadır: Person.ContactType yayımlanmamıştır ve Sales.Customer yayımlanmıştır. Birleştirme replikası, yayınlanan tablolara tetikleyiciler ekler. Bu nedenle, @@IDENTITY insert değeri kullanıcı tablosuna ekleme yerine bir çoğaltma sistem tablosuna döndürebilir.

Tablonun Person.ContactType maksimum kimlik değeri 20'dir. Tabloya @@IDENTITY bir satır eklerseniz ve SCOPE_IDENTITY() aynı değeri döndürürseniz.

USE AdventureWorks2022;  
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 aşağıdadır.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Tablonun Sales.Customer maksimum kimlik değeri 29483'tür. Tabloya @@IDENTITY bir satır eklerseniz ve SCOPE_IDENTITY() farklı değerler dönerseniz. SCOPE_IDENTITY() Değeri eklemeden kullanıcı tablosuna döndürürken @@IDENTITY , eklemeden gelen değeri çoğaltma sistemi tablosuna döndürür. Eklenen kimlik değerine erişim gerektiren uygulamalar için kullanım SCOPE_IDENTITY() .

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 aşağıdadır.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Ayrıca Bkz.

@@IDENTITY (Transact-SQL)