Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft 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