Kullanıcı Tanımlı Fonksiyonlar

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…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir