Identity | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar identity

Sql Server Identity Sutunları Belirlemek

20 January 2011 Yorum yapılmamış

BilgeAdam’daki eski öğrencilerimden biri şu soruyu sordu; “Herhangi bir veritabanındaki tüm tablolarda bulunan Identity Sütunları belirlemenin bir yolu var mıdır?”

Aslında bir değil, tam üç yolu var;

Yöntem 1 : COLUMNPROPERTY fonksiyonunu kullanmak

SELECT
	TABLE_NAME,
	COLUMN_NAME
FROM
	INFORMATION_SCHEMA.COLUMNS
WHERE
	COLUMNPROPERTY(OBJECT_ID(TABLE_NAME), COLUMN_NAME, 'ISIDENTITY') = 1
ORDER BY
	TABLE_NAME

Yöntem 2 : SYS.ALL_COLUMNS View’unu kullanmak

SELECT
	OBJECT_NAME(AC.OBJECT_ID),
	SO.NAME
FROM
	SYS.ALL_COLUMNS AS AC
	INNER JOIN SYS.OBJECTS AS SO ON OBJECT_NAME(AC.OBJECT_ID) = SO.NAME
WHERE
	AC.IS_IDENTITY = 1 AND
	SO.TYPE = 'U'

Aynı yöntemi biraz faklı olarak şöyle de yazabiliriz;

SELECT
	OBJECT_NAME(OBJECT_ID),
	NAME
FROM
	SYS.ALL_COLUMNS
WHERE
	IS_IDENTITY = 1 AND
	OBJECTPROPERTY(OBJECT_ID, 'ISUSERTABLE') = 1

Yöntem 3 : SYS.IDENTITY_COLUMNS View’unu kullanmak

SELECT
	OBJECT_NAME(IC.OBJECT_ID),
	SO.NAME
FROM
	sys.identity_columns AS IC
	INNER JOIN SYS.OBJECTS AS SO ON OBJECT_NAME(IC.OBJECT_ID) = SO.NAME
WHERE
	SO.TYPE = 'U'

Aynı yöntemi biraz faklı olarak şöyle de yazabiliriz;

SELECT
	OBJECT_NAME(OBJECT_ID),
	NAME
FROM
	sys.identity_columns
WHERE
	OBJECTPROPERTY(OBJECT_ID, 'ISUSERTABLE') = 1

@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() arasındaki farklar

02 December 2009 4 yorum

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