@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() Arasındaki Farklar
Sql Server‘da Identity kolon içeren tablolar ile çalışırken, son üretilen identity değerine ihtiyacımız olabilir. @@IDENTITY,SCOPE_IDENTITY() ve IDENT_CURRENT() bize son üretilen identity değerini verirler ancak hepsi bu işi farklı yöntemler ile yaparlar. Temel amaçları son üretilen identity değerini döndürmek.Sırası ile aralarındaki farklara bir göz atalım.
SELECT @@IDENTITY: Açılmış olan bağlantıda son üretilen identity değerini döndürür. @@IDENTITY tablo ve spoce bakmaksızın, bağlantıda üretilen son identity değerini verir. Dikkat: Eğer insert işlemi yapıldığında tabloda tanımlı olan bir Trigger varsa yanlış identity değerini alabilirsiniz.
SELECT SCOPE_IDENTITY(): Açılmış olan bağlantıda sorgunun çalıştığı scope‘ta son üretilen identity değerini verir. NOT: Trigger kullanılan tablolarda @@IDENTITY yerine SCOPE_IDENTITY() kullanılması tavsiye edilir.
SELECT IDENT_Current(table_name): Bağlantı veya scope bakmaksızın, parametre olarak verilen tabloda üretilen son identity değerini verir.
Konu daha iyi anlaşılması açısından bir örnek hazırladım. Hazırlamış olduğum örnekte 2 adet tablo oluşturup 1. tabloya insert işlemi olduğunda 2. tabloya kayıt atan bir Trigger tanımladım. 2. tabloma 3 tane insert işlemi ve 1. tabloma da 1 tane insert işlemi yapıp sırası ile @@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() çalıştırıp identity değerlerini listeledim.
[sql]
CREATE TABLE TBL1
(
ID INT NOT NULL IDENTITY (1, 1),
SpecialDesc VARCHAR(250) NULL,
Info VARCHAR(500) NULL
)
CREATE TABLE TBL2
(
ID INT NOT NULL IDENTITY (1, 1),
SpecialDesc VARCHAR(250) NULL,
Info VARCHAR(500) NULL
)
GO
CREATE TRIGGER TRG_TBL1 ON TBL1
FOR INSERT
AS
INSERT INTO TBL2
(SpecialDesc, Info)
VALUES
(‘Bu bir özel değer’, ‘Detaylı Bilgi’)
GO
INSERT INTO TBL2 (SpecialDesc, Info) VALUES (‘Aciklama1’, ‘Bilgi1’)
INSERT INTO TBL2 (SpecialDesc, Info) VALUES (‘Aciklama2’, ‘Bilgi2’)
INSERT INTO TBL2 (SpecialDesc, Info) VALUES (‘Aciklama3’, ‘Bilgi3’)
INSERT INTO TBL1 (SpecialDesc, Info) VALUES (‘Aciklama’, ‘Bilgi’)
SELECT @@IDENTITY
UNION ALL
SELECT SCOPE_IDENTITY()
UNION ALL
SELECT IDENT_CURRENT(‘TBL1’)
[/sql]
Sorgu çıktısından görüldüğü üzere SELECT @@IDENTITY çalışan Trigger‘dan etkilenerek yanlış identity değerini bize döndürmüştür.
SELECT SCOPE_IDENTITY() doğru sonucu bize döndürmüştür. (1)
Yararlı olması dileğiyle…
Merhaba Mesut Bey yazı Türkçe kaynak açısından verimli olmuş elinize sağlık.
Benim bir sorum olacak.Şu anda uğraştığım bir projede veritabanımda ki tablomda 2 sütun var (id ve kullanıcıismi)id kolonu her yeni kayıt eklendiğinde +1 yaparak ilerliyor son güncel kaydı bulabiliyorum ancak bana çalışma zamanında 100 kullanıcı içinde 5. sıradaki kullanıcının id’sini nasıl bulabilceğim? bu konu hakkında bilginiz var mı ? Teşkkürler , iyi çalışmalar..
Merhaba Ömer bey, faydalı olmasına sevindim. Sormuş olduğunuz sorunuzu ROW_NUMBER fonksiyonu ile çözüm bulabilirsiniz. Kayıtlarınızı ROW_NUMBER fonksiyonu ile numaralandırıp 5. sıradaki ID değerini sorgulayacaksınız.
https://msdn.microsoft.com/en-us/library/ms186734.aspx
Kolay Gelsin.