@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() Arasındaki Farklar
@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() Arasındaki Farklar
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ü.