Makale Özeti

Bu makalede SQL Server veritabanında yaratılmış tablolarda üzerinde tanımlanmış "Identity" sütunları için SCOPE_IDENTITY fonksiyonunun kullanımı anatılmaktadır.

Makale

SQL Server’da Identity Alanları ve SCOPE_IDENTITY


Sözlük:
Scope : İşlem Etki Alanı
Identity Column : Kimlik Sütunu
Identity Value : Kimlik Değeri
Identity Seed : Kimlik Tohumu

Tanım:

SCOPE_IDENTY değeri, bir “işlem etki alanı” dahilinde, bir “kimlik sütununa” yapılmış kayıt ekleme işlemlerinin en sonuncusu tarafından üretilen “kimlik değerini” verir. Bir “işlem etki alanı”; bir “stored procedure”, “trigger”, “function” veya “batch” işlemi olabilir. Yani, iki işlem ifadesi, aynı “stored procedure”, “function”, “trigger” veya “batch” işlemi dahilinde ise, sözkonusu iki işlem ifadesi aynı “işlem etki alanı” içerisindedir denebilir.

Söz Dizimi:

SCOPE_IDENTITY( )

Dönüş Değeri:

sql_variant

Açıklama:

SCOPE_IDENTITY, IDENT_CURRENT ve @@IDENTITY fonksiyonlarının hepsi, kimlik sütunlarına eklenen değerleri döndürdüklerinden birbirlerine benzerler.

IDENT_CURRENT değeri bir etki alanı veya oturum ile sınırlı değildir; sadece bir tablo ile sınırlıdır. IDENT_CURRENT fonksiyonu işlem etki alanlarından ve sunucuya açılmış oturumlardan bağımsız olarak, belirtilen bir tablo için üretilmiş kimlik değerini geri döndürür. Daha fazla bilgi için IDENT_CURRENT makalesini inceleyiniz.

SCOPE_IDENTITY ve @@IDENTITY değerleri ise açılmış oturum ile sınırlı olup, sorgulandıkları oturum dahilinde üretilmiş son kimlik değerlerini döndürürler. Ancak, SCOPE_IDENTITY sadece “işlem etki alanı” dahilinde üretilmiş son kimlik değerini döndürürken, @@IDENTITY bir “işlem etki alanı” ile sınırlı değildir.

Örneğin, TBL01 ve TBL02 adında iki tablonuz olduğunu ve TBL01 üzerinde bir Insert Trigger tanımlanmış olduğunu varsayalım. TBL01 tablosuna yeni bir kayıt eklendiği zaman, Insert Trigger çalışıyor ve TBL02 tablosuna yeni bir kayıt atıyor olsun. Bu senaryoda iki adet işlem etki alanı sözkonusu: birincisi TBL01 tablosuna yapılan INSERT ifadesi, ikincisi de trigger.

Hem TBL01 hem de TBL02 tablolarında birer kimlik sütunu tanımlanmış olduğunu varsayalım. Bu durumda TBL01 tablosuna yapılan bir yeni kayıt ekleme işlemi sonrasında, @@IDENTITY ve SCOPE_IDENTITY fonksiyonları farklı değerler döndüreceklerdir.

@@IDENTITY mevcut oturum dahilinde, oluşan işlem etki alanlarını dikkate almadan, veritabanı üzerinde üretilen son kimlik değerini; TBL02 tablosuna eklenen değeri döndürecektir.

SCOPE_IDENTITY() fonksiyonu ise aynı etki alanı içerisinde üretilmiş son kimlik değeri olan, TBL01 tablosu için üretilen kimlik değerini döndürecektir.

Örnek:

Bu örnekte TBL01 ve TBL02 adında iki tablo yaratılmakta ve TBL01 tablosu üzerine TRG01 adında bir Insert Trigger tanımlanmaktadır. TBL01 tablosuna yeni bir kayıt eklendiğinde, TRG01 adındaki Insert Trigger ateşlenmekte ve trigger dahilinde TBL02 tablosuna yeni bir kayıt eklenmektedir.


USE Northwind
GO

/* Birinci tabloyu yaratalım */

CREATE TABLE TBL01(
Kod int IDENTITY(1,1)PRIMARY KEY,
Ad varchar(20) NOT NULL)

/* Birinci tabloya kayıtları ekleyelim */

INSERT TBL01 (Ad) VALUES ('İlhan')
INSERT TBL01 (Ad) VALUES ('Nevay')
INSERT TBL01 (Ad) VALUES ('Gülay')

SELECT * FROM TBL01

/*
Sonuç Tablosu: TBL01 şu anda böyle görünüyor
Kod Ad
-------------
1 İlhan
2 Nevay
3 Gülay
*/

/* İkinci tabloyu yaratalım, kimlik tohumuna dikkat */

CREATE TABLE TBL02 (
Kod int IDENTITY(100,5)PRIMARY KEY,
Ad varchar(20) NULL)

/* İkinci tabloya kayıtları ekleyelim */

INSERT TBL02 (Ad) VALUES ('Laila')
INSERT TBL02 (Ad) VALUES ('Paris')
INSERT TBL02 (Ad) VALUES ('Santa')

SELECT * FROM TBL02

/*
Sonuç Tablosu: TBL02 şu anda böyle görünüyor
Kod Ad
---------------
100 Laila
105 Paris
110 Santa
*/

/*
TBL01’e kayıt eklendiğinde, TBL02’ye yeni kayıt
ekleyecek “trigger”ı yaratalım
*/

CREATE TRIGGER TRG01
ON TBL01
FOR INSERT AS
BEGIN
INSERT TBL02 VALUES ('')
END

/*
Şimdi trigger’ı ateşleyecek insert işlemini yapalım ve
@@IDENTITY ile SCOPE_IDENTITY fonksiyonunun ne değerler
Döndürdüklerine bakalım.
*/

INSERT TBL01 VALUES ('Melek')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO

SELECT @@IDENTITY AS [@@IDENTITY]
GO

/*
İşte sonuç
SCOPE_IDENTITY
4

SCOPE_IDENTITY işlem etki alanı içerisindeki son kimlik
değerini, TBL01 üzerinde yaratılan kimlik değerini döndürdü

@@IDENTITY
115

@@IDENTITY ise TBL01 tablosuna yeni kayıt eklenmesi ile
Ateşlenen TRG01 adlı “trigger”ın, TBL02 tablosuna yeni kayıt
eklemesi ile TBL02 tablosu üzerinde yaratılan kimlik değerini
döndürdü.
*/

Eğer SCOPE_IDENTITY() fonksiyonu bir işlem etki alanı içerisinde tek başına çağırılırsa, yani SQL Server Query Analyzer’ı açarak sadece

SELECT SCOPE_IDENTITY()

yazıp çalıştırırsanız, fonksiyon NULL değeri dönecektir.

Eğer SCOPE_IDENTITY() fonksiyonu bir işlem etki alanı içerisinde ilk işlem ifadesi olarak çağırılırsa, yani SQL Server Query Analyzer’ı açarak sadece:

SELECT SCOPE_IDENTITY()
INSERT TBL01 (Ad) VALUES ('Levent')


yazıp çalıştırırsanız, fonksiyon yine NULL değeri dönecektir.

Eğer bir işlem etki alanı içerisinde SCOPE_IDENTITY fonksiyonu, içerisinde kimlik sütunu olmayan tablolara yapılan kayıt ekleme ifadelerinden sonra çağırılırsa, yine SCOPE_IDENTITY fonksiyonu NULL değeri dönecektir.

IDENT_CURRENT hakkında daha fazla bilgi için tıklayınız.
@@IDENTITY hakkında daha fazla bilgi için tıklayınız.