Makale Özeti

Bu makalede SQL Server veritabanında yaratılmış tablolar üzerinde tanımlı Identity alanlar ile @@IDENTITY değeri arasındaki ilişki detayları ile anlatılmaktadır.

Makale

SQL Server’da Identity Alanlar ve @@IDENTITY



Tanım
Bir oturumda, veritabanında üretilen son kimlik değerini döndürür.

Söz Dizimi:
@@IDENTITY

Dönüş Tipi
Numeric

Açıklama
Bir INSERT, SELECT INTO veya toplu kopyalama ifadesi çalıştırıldıktan sonra, @@IDENTITY değeri yaratılan son kimlik değerini tutar.

- Eğer sql ifadesi üzerinde kimlik sütunu tanımlı herhangi bir tabloyu etkilemediyse, @@IDENTITY değeri NULL olacaktır.

- Eğer sql ifadesi dahilinde üzerinde kimlik sütunu olan bir tabloya birden fazla yeni kayıt eklendiyse ve bundan dolayı birden fazla kimlik değeri üretildiyse, @@IDENTITY değeri eklenen son kayıt için üretilen kimlik değerini tutacaktır.

- Eğer çalıştırılan sql ifadesi, başka tablolara yeni kayıtlar ekleyerek, yeni kimlik değerleri üreten bir veya daha fazla trigger’ı ateşlerse, sql ifadesinin hemen sonrasında sorgulanan @@IDENTITY değeri, trigger’lar tarafından gerçekleştirilen yeni kayıt ekleme işlemlerinden sonuncusu tarafından üretilen kimlik değerini döndürecektir.

- Eğer INSERT, SELECT INTO veya toplu kapyalama işlemi bir transaction içerisinde yapılırken, bir hata oluşur ve transaction Roll Back edilirse, sözkonusu Roll Back @@IDENTITY değerini eski haline getirmez. Örneğin, üzerinde bir kimlik sütunu tanımlı olan A adında bir tablomuz olduğunu varsayalım. Mevcut durumda A tablosuna son eklenen kaydın kimlik değerinin 89 olduğunu kabul edelim. A tablosuna bir kayıt ekleyen sql cümleciğini çalıştrımadan önce BEGIN TRAN ifadesi ile bir transaction başlatalım. Daha sonra A tablosuna yeni kaydı ekleyen sql cümleciğini çalıştıralım. Bu noktada SELECT @@IDENTITY ifadesi bize 90 değerini döndürecektir. Sql cümleciğinin ardından, başlatmış olduğumuz transaction’ı geri alan, dolayısı ile yapılan yeni kayıt ekleme işini iptal eden ROLLBACK TRAN komutunu çalıştırdıktan sonra SELECT @@IDENTITY ifadesini çağırdığımızda, yine 90 değeri bize dönecektir.

@@IDENTYT, SCOPE_IDENTITY, IDENT_CURRENT
SCOPE_IDENTITY, IDENT_CURRENT ve @@IDENTITY fonksiyonlarının hepsi, kimlik sütunlarına eklenen değerleri döndürdüklerinden birbirlerine benzerler.

Sorgulanan @@IDENTITY değeri de, SCOPE_IDENTITY fonksiyonu da, mevcut oturumda en son üretilen kimlik değerini geri döndürürler. Ancak, SCOPE_IDENTITY sadece “işlem etki alanı” dahilinde üretilmiş son kimlik değerini döndürürken, @@IDENTITY bir “işlem etki alanı” ile sınırlı değildir. Örneğin, TBLSP adlı üzerinde bir kimlik üütunu tanımlı olan bir taboya yeni kayıt ekleyen bir "stored procedure"ımız olsun. Bu "stored procedure"un dönüş değeri olarak yeni kayda atanan kimlik değeri olmasını istersek, @@IDENTITY değerini mi, SCOPE_IDENTITY değerini mi kullanmamız daha doğru olur? Eğer TBLSP tablosunun üzerinde herhangi bir Trigger yoksa ikisi de büyük ihtimalle aynı sonucu döndürecektir. Ancak bu "stored procedure"ü çağıran uygulamamız multi-thread çalışıyorsa ve her thread'in aynı veritabanı bağlantısını kullanarak bu stored procedure'ı çarğırma ihtimali varsa, ya da web tabanlı uygulamanızda Session'lar arasında veritabanı bağlantısını kullanıyorsanız veya TBLSP tablosunda üzerinde kimlik sütuunu olan başka tablolara kayıt ekleyen bir trigger tanımlıysa, @@IDENTITY size hatalı sonuç dönebilir.

IDENT_CURRENT fonksiyonu ise ne işlem etki alanı, ne de mevcut oturum ile sınırlıdır. IDENT_CURRENT tüm oturumlardan ve işlem etki alanlarından bağımsız olarak, belirli bir tablo için üretilen son kimlik değerini döndürür.

Örnek:
Bu örnekte bir TBL01 adlı bir tabloya yeni bir kayıt eklenmekte ve daha sonra @@IDENTITY değeri sorgulanmaktadır:

INSERT INTO TBL01 (Ad, Soyad)
VALUES (‘Ahmet’,’Ekici’)
SELECT @@IDENTITY AS 'Son Kimlik Değeri'