Ana Sayfa > Programlama, SQL > @@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ı;

IDENTITY_SCOPE_IDENTITY_IDENT_CURRENT

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


İlgili diğer başlıklar:

  1. Bu kodda ne yanlış var? – 1
  2. Sql Server 2008′de Çoklu Insert İşlemi
  3. Sql Server’da Hash işlemi
  4. .Net Framework’te Timer Class’ları Arasındaki Farklar
  5. Sql Server veritabanında en büyük 10 tablo

  1. Henüz yorum yapılmamış.
  1. Henüz geri dönüş yok.