Transact Sql(Functions-Scalar Function-Inline Function)

Bu yazımda T-SQL de fonksiyonlardan bahsedeceğim.T-SQL de iki tip fonksiyon vardır.Bunlardan biri geriye istediğimiz bir tipde değer gönderen Scalar fonksiyonlar,diğeri ise geriye tablo gönderen inline fonksiyonlardır.
FUNCTIONS (FONKSİYONLAR) (GERİYE DEĞER GÖNDEREN METOD)
1.SCALAR FUNCTION :


create function topla(@sayi1 int,@sayi2 int) returns int
as
begin
return @sayi1+@sayi2
end

topla : Fonksiyonun adı.
(@sayi1 int,@sayi2 int) : Fonksiyonun değerlerini dışarıdan alacağı parametreleri ve tipleri.
returns int : Geriye dönecek değerin tipini belirliyoruz.
return @sayi1+@sayi2 : Geriye döndürülen değer.
Database in Programmability klasöründen Functions ve oradan Scalar valued functionsadan bu fonk. görülebilir. Fonk. a sağ tıklanıp modify ile kodlarına erişilebilir.
Eğer fonksiyonun kodlarına erişilmesin istiyorsak “with encryption” kullanılır.


create function topla2(@sayi1 int,@sayi2 int) returns int
with encryption
as
begin
return @sayi1+@sayi2
end

Şimdide gelin “topla2” adındaki fonksiyonumuzu kullanalım.
select topla2(4,5) – Bu şekilde kullanım yaparsak çalışmayacaktır.Çünkü fonksiyonun şemasını yazmamız gerekiyor.


select dbo.topla2(3,4) – Bu şekilde “7” sonucunu geri döndürecektir.

Şimdi bir örnek çözelim.
“Northwind” tablosunda çalışalım.
Her bir ürünümün %18 KDV dahil olmak üzere toplam maliyetini getiren fonk. yazınız.
1.Fonksiyonu yazalım.


go
create function maliyet(@BirimFiyati int,@StokMiktari int) returns nvarchar(50)
as
begin
declare @sonuc int
set @sonuc = @BirimFiyati * @StokMiktari * 1.18
return @sonuc
end

2.Kullanalım.
Tabi kullanırken şunuda göstereyim yazdığımız fonksiyona aşağıdaki gibi elimle değer gönderebiliyorum.


select dbo.maliyet(10,10)

2. olarak tablodaki kolonlardan verileri alıp fonksiyonda işletebiliyorum.


select
UrunAdi,
BirimFiyati,
HedefStokDuzeyi,
dbo.maliyet(BirimFiyati,HedefStokDuzeyi)
from Urunler

Herhangi bir kolonda fonksiyon kullanılarak,otomatik hesaplanabilir kolonlar(Computed Column) oluşturmak mümkündür.
Çıktı olarak ………… kategorisindeki ……….. ürününün toplam fiyatı : ………… ‘ dır. şeklinde bir çıktı veren fonksiyonu yazınız. Bu fonksiyon parametre olarak KategoriAdi,UrunAdi,BirimFiyati ve HedefStokDuzeyi alacak
1.Fonksiyonu yazalım.


go
alter function cikti(@kategori varchar(50),@urunadi varchar(50),@birimfiyat int,@stok int) returns varchar(MAX)
as
begin
declare @cikti varchar(100)
set @cikti = @kategori + ' kategorisindeki ' + @urunadi + ' ürününün toplam fiyatý : ' + CAST(@birimfiyat*@stok as varchar(100)) + ' dýr.'
return @cikti
end

2.Kullanalım.


select
dbo.cikti(k.KategoriAdi,u.UrunAdi,u.BirimFiyati,u.HedefStokDuzeyi)
from Urunler as u inner join Kategoriler as k on u.KategoriID=k.KategoriID

Fonksiyon içinde normal sorguda yazabiliriz.


select CHAR(91) – Char() ile sayısal değerlerin karakter karşılığını elde ederiz.
select ASCII('a') – Ascii() ile de verilen karakterin ASCII kodu elde edilir.

2.INLINE FUNCTIONS :
Geriye bir değer değil,tablo gönderen fonksiyonlardır.Geriye tablo göndereceği için bu fonksiyonlar çalıştırılırken sanki bir tablodan sorgu çalıştırılır gibi çalıştırılırlar.Bu yönleriyle viewlere benzerler.View ile yapılan işlevler inline functions larlada yapılabilir.Genellikle bu tarz işlemler için view kullanmanızı öneririm.
Inline functions oluşturulurken begin end kullanılmaz.


go
create function fc_Gonder(@ad varchar(20),@soyad varchar(20)) returns table
as
return select Adi,SoyAdi from Personeller where Adi=@ad and SoyAdi=@soyad

Kullanımı


select * from dbo.fc_Gonder('Nancy','Davolio')
select Adi from dbo.fc_Gonder('Nancy','Davolio')

NOT:With de viewlere benzer bir yapı sunarlar.


with denemeasddsa(ad)
as
(
select Adi from Personeller
)
select * from denemeasddsa

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 03 Ekim 2016

    […] Row Level Security özelliğini kullanabilmemiz için Inline Table Value Funtion oluşturmalıyız. Bu fonksiyon, kullanıcı sorguyu çalıştırdığında geriye 1 yani true […]

Bir cevap yazın

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

*

Copy Protected by Chetan's WP-Copyprotect.