@@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]

resultList

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…

 

 

office yazılım lisansı satın al

Mesut Güneş

Selçuk Üniversitesi Bilgisayar programcılığı bölümünden mezun olduktan sonra birçok firmada Yazılım, İş zekası ve Veritabanı Uzmanı olarak çalıştım. Şuan Türkiye’nin en büyük şirketlerinden biri olan Doğan Online’da Veritabanı Yöneticisi olarak çalışıyorum.

You may also like...

2 Responses

  1. ömer dedi ki:

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

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.