UDF (User Defined Function), kullanıcı tanımlı fonksiyonlar birden fazla t-sql ifadesinin art arda işlenip bir sonuç üretilmesi için kullanılan sql server objeleridir diyebiliriz. Stored procedure’lerden farklı olarak kullanıcı tanımlı fonksiyonlar içinde DML işlemleri yapamayız. Fonksiyonlarda sorgu sonucunda gelen değer kullanıcıya döndürebiliriz.
–Sp’lerden dönen değer spnin doğru çalışıp çalışmadığını kontrol ederken, fonksiyonlardan dönen değeleri başka bir işlem de kullanabiliriz.
–Spler içinde RAISEERROR veya @@ERROR gibi yapılar ile hata kontrolü yapabiliyorduk, ama kullanıcı tanımlı fonksiyonlarda bu şekilde hata kontrolü yapılamaz.
–Fonksiyonların içinde geçici tabloları kullanamayız ve splerde olan output parametresi kullanıcı tanımlı fonksiyonlarada yoktur bunun yerine return type adlı yapıyı kullanabiliriz.
Scalar değer döndüren fonksiyonlar
Bir veya daha fazla parametre alıp basit bir değer döndüren fonksiyonlardır. Bu gibi fonksiyonlar matematiksel işlem yapan fonksiyonlar oduğu gibi daha kompleks yapı içeren fonksiyonlar da olabilir.
create function dbo.ConcatPerson (@emailpromotion int) returns varchar (max)as begin declare @name varchar(max); set @name=''; select @name= @name + FirstName +',' from Person.Person where EmailPromotion=@emailpromotion; return @name; end select dbo.ConcatPerson (2)
Yukarıdaki scalar fonksiyon AdwentureWorks database’inde person.person tablosunda emailpromotion değeri 2 olan firstname ler arasına virgül koyarak listelemiştir ve geri değeri döndürmüştür.
Tablo Değer Döndüren Fonksiyonlar
Geriye scalar değer değil tablo şeklinde bir sonuç seti döndüren fonksiyonlardır.
Inline table-valued fonksiyonlar
Bu fonksiyonların sonuçları sanki bir tabloymuş gibi sorgulanabilir. Viewlere benzesede viewlerde parametre geçemeyeceğimiz için ayrışırlar. Bu fonksiyonları parametrik viewler olarak da adlandırabiliriz. Herhangi bir hesaplama yapmayacağımız için begin ve end blokları arasına kodumuzu yazmamıza gerek yoktur.
create function dbo.PersonDetails (@businessId int) returns table as return (select * from Person.Person where BusinessEntityID=@businessId ) go select * from PersonDetails (5)
Fonksiyonumuz bize verdiğimiz değerlere göre bir table döndürmüştür. Sonuç olarak gelen table resultı başka tablolarla join edebiliriz. Bunun için cross apply ve outer apply komutlarını kullanabiliriz.
Cross apply komutu ile inner join yaparken outer apply komutu left outer join yapmaktadır.
Multi Statement Table-Valued Fonksiyonlar
İnline Table Valued fonksiyonlardan farkı sadece bir sorgu sonucunun döndürmek yerine daha kompleks işlemler yapıp bu işlemler sonucunda çıktıyı tablo şeklinde geriye döndürmektir.
create Function FunctionName(Input parametreleri) returns @TableName Table (kolon listesi) as begin table tipli değişkenin doldurulması için işlemler return end
Multi-Statement Table-Valued fonksiyonlara verilen tablo tipli değişkenler doldurulurken tempdb sistem veritabanını kullanılır. Çok fazla kaydın döndüreleceği durumlarda multi-statement table-valued fonksiyon kullanmak performans sorunu yaratabilir.
Önemli Kavramlar
Deterministik Fonksiyon: Fonksiyon aynı parametrelerle her çağırıldığında aynı sonucu üretmeyi garanti eden fonksiyonlardır. 4 işlem içeren fonksiyonları bunlara örnek verebiliriz. Aynı parametreler verildiğinde her zaman aynı sonucu döndüreceklerdir.
Nondeterministik Fonksiyon: Farklı zamanlarda aynı parametrelerle çağırıldığında farklı sonuç veren fonksiyonlardır.GETDATE(), RAND(),NEWID() fonksiyonları bu tip fonksiyonlara örnek olarak verilebilir.
Schema Binding Kavramı
Fonksiyonumuzu oluştururken with schema binding komutu ile oluşturursak, fonksiyonumuz içinde kullanılan tüm tablolar şema değişikliklerine karşı korunmuş olur. İlgili tablolara yeni bir kolon eklenebilmesine rağmen, var olanlar değiştirilemezler.
create function FuncName(Input) returns Datatype with schema binding as begin fonksiyon kodu return expression; end
İyi çalışmalar…