MSSQL’de toplu yapılması istenen veya birçok kez yapılacak işlemlerin bir sonuç döndürmesi isteniyorsa fonksiyonlardan yararlanılabilir.
MSSQL’de ön tanımlı olan GETDATE(), LEN(), MAX(), MIN() gibi birçok fonksiyon vardır ve bunların tamamı geriye çeşitli türlerde değer döndürür. Ancak veritabanı programcısı isterse kendi fonksiyonlarını da oluşturabilir.
SQL Server’da fonksiyon oluşturmak için CREATE FUNCTION komutu kullanılır. Her bir fonksiyon mutlaka değer döndürür ancak parametre almak zorunda değildir. Fonksiyonlar bir sorgu içinden veya “stored procedure” içinden çağrılabildiği gibi hesaplanmış alanlarda kullanımı da mümkündür. Ancak bir fonksiyonun içinden stored procedure çağrılması mümkün değildir.
Bir fonksiyonun genel kullanımı aşağıdaki gibidir:
1 2 3 4 5 6 7 | CREATE FUNCTION fonksiyon_adı (@parametre1 değer_tipi1, @parametre2 değer_tipi2, ...) RETURNS dönüş_değer_tipi AS BEGIN --Yapılacak işlemler RETURN değer; END; |
Fonksiyonun oluşturulması aşamasında mutlaka bir dönüş değer tipi belirlemek gerekir ve bu fonksiyonun içinden de mutlaka uygun tipte bir değer RETURN deyimi ile döndürülür.
Türkçe karakterleri uygun Latin karakterlerine dönüştüren MSSQL fonksiyon örneği:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATE FUNCTION karakterDegistir (@metin VARCHAR(30)) RETURNS VARCHAR(30) AS BEGIN SET @metin = LOWER(@metin); SET @metin = REPLACE(@metin,'ü','u'); SET @metin = REPLACE(@metin,'ş','s'); SET @metin = REPLACE(@metin,'ç','c'); SET @metin = REPLACE(@metin,'ö','o'); SET @metin = REPLACE(@metin,'ı','i'); SET @metin = REPLACE(@metin,'İ','i'); SET @metin = REPLACE(@metin,'ğ','g'); RETURN @metin; END; |
Gönderilen parametrelere göre mail adresi oluşturma MSSQL fonksiyon örneği:
1 2 3 4 5 6 | CREATE FUNCTION mailAdresi (@adres VARCHAR(30), @uzanti VARCHAR(30)) RETURNS VARCHAR(50) AS BEGIN RETURN dbo.karakterDegistir(@adres)+'@'+@uzanti; END; |
Yukarıdaki fonksiyonlar bir tablonun hesaplanmış alan (computed field / calculated field) olarak kullanım örneği aşağıdaki gibidir:
1 2 3 4 5 6 | CREATE TABLE personel ( personel_no SMALLINT IDENTITY(1,1) PRIMARY KEY, ad VARCHAR(20) NOT NULL, soyad VARCHAR(20) NOT NULL, mail AS dbo.mailAdresi(ad+'.'+soyad,'market.net') ); |
Yukarıdaki örnek personel tablosunda mail alanı bir fonksiyon yardımıyla hesaplanmış alan haline getirilmiştir.
Sorgu içinde fonksiyon kullanımı
Bir sorgu içinde yukarıdaki fonksiyonların kullanımı ise şu şekildedir:
1 | SELECT karakterDonustur(ad) FROM personel WHERE personel_no=5 |