Kullanıcı Tanımlı Fonksiyonlar (User Defined Functions), yerleşik SQL fonksiyonları dışında kullanıcılar tarafından oluşturulan ilişkisel veri tabanı nesneleridir. SQL Server 2000 ile birlikte gelen Kullanıcı Tanımlı Fonksiyon oluşturma işlemi, tek bir değer veya tablo döndürmek için kullanılabilir. Bu tür fonksiyonlar CLR (Common Language Runtime - Ortak Dil Çalıştırma Platformu) ya da T-SQL (Transact-SQL) temelli olarak yazılabilir ancak aşağıdaki bilgilendirmede T-SQL dili temel alınmıştır. Fonksiyonlarda tanımlanan bir değişken, fonksiyon içerisinde değiştirilemez yani bütün parametreler oluşturulan fonksiyonda belirtilmek zorundadır. Oluşturulan fonksiyonlara erişmek için SQL Server üzerinde, fonksiyonun tanımlandığı database seçildikten sonra Programmability-> Functions yolu izlenir. Üç çeşit kullanıcı tanımlı fonksiyon vardır. Bu bilgilendirmede, Windows tarafından örnek olarak hazırlanan "AdventureWorks" veri tabanı örneklendirmeler için kullanılacaktır.
Tablo Döndüren Fonksiyonlar (Table-valued Functions)
Sayısal değerli fonksiyondan tek farkı döndürdüğü verinin tablo olmasıdır. Viewlerle büyük benzerlikler içerir ancak farklı olarak dışarıdan parametre alabilirler. Örneğin; "fn_sirketeGoreSirala" alıştırması bu tip bir fonksiyon sayesinde yapılmıştır.
CREATE FUNCTION fn_sirketeGoreSirala (@sirket varchar(50))
RETURNS table
AS
RETURN Select SalesLT.Customer.FirstName from SalesLT.Customer where SalesLT.Customer.CompanyName=@sirket
Go
Oluşturulan örnek fonksiyona Programmability-> Functions-> Table-valued Functions yoluyla ulaşılabilir. Fonksiyonu çalıştırmak için aşağıdaki örnek kod çalıştırılmalıdır:
Select * from dbo.fn_sirketeGoreSirala('A Bike Store')
Sayısal Değerli Fonksiyonlar (Scalar-Valued Functions)
Tek değer döndüren fonksiyon çeşididir. Bazı durumlarda kullanıcıların tercih ettiği bir tiptir. Tek değer döndürmek ile anlatılmak istenilene GETDATE() sistem fonksiyonu örnek olabilir. GETDATE() fonksiyonu çalıştırıldığında sisteminin zaman ve saatini döndüren yani tek değer döndüren bir sayısal değerli sistem fonksiyonudur. Aşağıda örnek olarak oluşturulan "fn_customer fonksiyonu" da sayısal değerli fonksiyona örnektir. AdventureWorks veritabanında kullanıcının girdiği isimle veritabanında eşleşen müşteri isimlerinin sayısını döndüren bir fonksiyon yazılmıştır.
CREATE FUNCTION fn_customer (@isim varchar(10))
RETURNS int
AS
Begin
Declare @sayi int
IF @isim is null
Select @sayi = (Select count(*) from SalesLt.Customer)
ELSE
Select @sayi = (Select count(*) from SalesLT.Customer where SalesLT.Customer.FirstName=@isim)
RETURN @sayi
End
Go
Oluşturulan örnek fonksiyona Programmability-> Functions-> Scalar-valued Functions yoluyla ulaşılabilir. Fonksiyonu çalıştırmak için aşağıdaki örnek kod çalıştırılmalıdır:
Select dbo.fn_customer('Orlando') as Sayi
Aggregate Fonksiyonlar
Kullanıcı tanımlı fonksiyonların en az kullanılan türüdür. Sistem fonksiyonları altında da Aggregate fonksiyonları vardır. Min(), Max(), Sum() gibi fonksiyonlar bunlara örnektir. Ancak Sistem Aggregate fonksiyonları yapılacak bir işlem için yeterli değil ise, kullanıcı tanımlı aggregate fonksiyon tanımlanır.