Sql Server’da Identity kolon içeren tablolar ile çalışırken, yeni üretilen identity değerine ihtiyacımız olur.
@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() aynı işi farklı yöntemlerle yapar; son üretilen identity değerini döndürmek.
SELECT @@IDENTITY Açılmış olan bağlantıda son üretilen identity değerini döndürür. @@IDENTITY tablo ve scope bakmaksızın, connection’da üretilen son identity’yi verir. Dikkat : Eğer Insert yaptığınız tablo’da Trigger varsa, yanlış identity alabilirsiniz.
SELECT SCOPE_IDENTITY() Açılmış olan bağlantıda ve sorgunun çalıştığı scope’ta son üretilen identity’yi döndürür. Trigger kullanılan tablolarda @@IDENTITY yerine SCOPE_IDENTITY() kullanılması tavsiye edilir.
SELECT IDENT_CURRENT(tablename) Bağlantı ve scope bakmaksızın, parametre olarak verilen tabloda üretilen son identity değerini döndürür.
Örnek;
CREATE TABLE TEST_TABLO_1 ( ID INT NOT NULL IDENTITY (1, 1), ACIKLAMA VARCHAR(500) NULL, BILGI VARCHAR(1000) NULL )
CREATE TABLE TEST_TABLO_2 ( ID INT NOT NULL IDENTITY (1, 1), ACIKLAMA VARCHAR(500) NULL, EKSTRA_BILGI VARCHAR(1000) NULL )
GO
CREATE TRIGGER TRG_TEST ON TEST_TABLO_1 FOR INSERT AS INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES (‘Açıklama’, ‘Extra Bilgi’)
GO
INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES (‘DENEME’, ‘TEST1’) INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES (‘DENEME’, ‘TEST2’) INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES (‘DENEME’, ‘TEST3’) INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES (‘DENEME’, ‘TEST4’)
INSERT INTO TEST_TABLO_1 (ACIKLAMA, BILGI) VALUES (‘DENEME’, ‘TEST1’)
SELECT @@IDENTITY UNION ALL SELECT SCOPE_IDENTITY() UNION ALL SELECT IDENT_CURRENT(‘TEST_TABLO_1’)
GO
DROP TRIGGER TRG_TEST DROP TABLE TEST_TABLO_1 DROP TABLE TEST_TABLO_2
Sorgunun çıktısı;
Gördüğünüz gibi, SELECT @@IDENTITY çalışan Trigger’dan etkilenerek yanlış sonucu döndürmüştür.
TEST_TABLO_2‘ye ilk eklediğimiz kayıtta, identity olarak 5 aldık.
**SELECT **SCOPE_IDENTITY() ise, doğru değer (1) döndürdü.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484