SQL Table-Valued Functions – Tablo Fonksiyonları , yazım ile sql eğitim setime devam ediyorum. Bu yazımızda geri dönüş olarak tablo gönderen fonksiyonları göreceğiz. En çok kullanacağımız şey bu olacak. Hemen hemen bütün select sorgularımızı bu fonksiyonlar ile yapıp projelerimizde kullanacağız. Gelin SQL Table-Valued Functions – Tablo Fonksiyonları nı görelim.
SQL Table-Valued Functions – Tablo Fonksiyonları
Bunu çok kullanmamın sebebi aslında şudur;
Select sorgularını C# yada başka bir dille yazdığımız projelerimizin içinde tutarsak bu sorguda bir şey değişmesi gerektiğinde projeyi değiştirip build etmemiz gerekir. Ancak fonksiyon kullandığımızda buna gerek kalmaz. SQL ‘i açarız ve istediğimiz kolonları ekler, istediğimiz kolonları çıkartırız ve proje de aktif olur. Tabi ki bu üzerinde işlem yaptığımız kolonları kapsamıyor.
Örneğin ID kolonundaki veri üzerinden bilgileri güncelleme yada silme gibi bir işlem yapıyorsanız ve bunu arka planda kolon adını kullanarak yapıyorsanız, fonksiyonda bu kolona dokunmamanız gerekir. Aksi takdirde projeye müdahale etmek zorunda kalırsınız.
NOT: projelerimizde genelde kolondaki bir veriyi almak istediğimizde kolon adını kullanırız ancak bunu kolon index’ini kullanarak da yapabiliriz. Bu seferde ilgili kolonun sırasının değişmemesi gerekir.
Şimdi SQL Management Studio yu açalım, database’imizi açalım (solundaki + ya tıklayalım) ve programability ve son olarakta Function klasörünü açalım.
SQL Management Studio > Database > Programability > Functions
Functions klasörünü açtıktan sonra Table-Valued Functions üzerinde sağ tık yapalım ve New Inline Table-Valued Function ‘a tıklayalım .
Query sayfası açıldığında şu kodlar olacaktır;
-- ================================================ -- Template generated from Template Explorer using: -- Create Inline Function (New Menu).SQL -- -- Use the Specify Values for Template Parameters -- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in -- the definition of the function. -- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> ( -- Add the parameters for the function here <@param1, sysname, @p1> <Data_Type_For_Param1, , int>, <@param2, sysname, @p2> <Data_Type_For_Param2, , char> ) RETURNS TABLE AS RETURN ( -- Add the SELECT statement with parameter references here SELECT 0 ) GO
Bu sayfayı aşağıdaki şekilde düzenleyelim. Eski bir projemin database’i üzerinden hazırladığım bir fonksiyondur.
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION fn_Siparisler_Listesi_Tarihsel ( @ilk_tarih as nvarchar(20), @son_tarih as nvarchar(20) ) RETURNS TABLE AS RETURN ( SELECT [Sip_RECno] AS RECNO ,[Sip_Masa_RECno] AS MASA_REC ,[Adisyon_No] AS ADİSYON ,[Da_Kac_Kisi_Var] AS MASA_SAYİ ,[Sip_Adet] AS SİP_ADET ,[Sip_Siparis_Kodu] AS SİP_KODU ,[Sip_Siparis] AS SİPARİS ,[Sip_Fiyat] AS FİYAT ,[Sip_Alan] AS SİP_ALAN ,[Sip_Tarih] AS SİP_TARİH ,[Adisyon_Alindi] AS ADİSYON_DURUM ,[Sip_Tarih] AS SİP_TARİH FROM SIPARISLER WHERE Masa_Sip_Tarih >= @ilk_tarih AND Masa_Sip_Tarih <= @son_tarih AND Aktif = 1 AND Masa_Sip_Iptal = 0 ) GO
Burada iki tarih arasındaki siparislerin listesini veren bir fonksiyon görüyorsunuz.
Aktif = 1 demek silinmemiş siparişlerdir
Masa_Sip_İptal = İptal edilmemiş siparişler demektir.
ÖNEMLİ NOT:
Burada gördüğünüz gibi tarih aralığını between ile yapmadım. Bu konuda daha bir forumda birkaç kişi ile tartışmıştım. Öyle olmaz böyle olmaz vs. vs. diyordu. Bu şekilde kullanmamın en büyük amacı performanstır. Milyonlarca satırlık tablolar üzerinde hem between ile hemde buradaki gibi bir sorgu çalıştırdığımda arada yaklaşık 5 dakika süre vardı. Siz istediğinizi kullanmakta özgürsünüz. Ben şahsen between ‘i hiç kullanmadım kullanmayı da düşünmüyorum.
Şimdi de bu fonksiyonu nasıl kullanacağımıza gelelim.
select * from dbo.fn_Siparisler_Listesi_Tarihsel('20180101','20190101')
Şimdi yukarıda bahsettiğim şeye tekrar döneyim.
Ne demiştim; fonksiyon kullandığımızda projede değişiklik yapmamıza gerek yoktu. Yukarıda verdiğim şekilde kullandığımızda fonksiyon içerisinde bir değişiklik yaptığınızda formu kapatıp açmanız, değişikliğin aktif olması için yeterli olacaktır.
Table valued functions vs stored procedures yada table valued functions vs views gibi şeylere girmeyi hiç düşünmüyorum ama yine de kısaca belirtmek gerekirse;
SP ‘yi fonksiyon gibi kullanmayı pek mantıklı bulmuyorum. Elbette SP de de sadece select kullanılabilir ama fonksiyon bu iş için daha iyi gibi.
View’de kısmen fonksiyon yerine geçebilir. Ama View’lerin asıl amacı karmaşık ilişki tabloları bir tasarım ekranı üzerinden ilişkilendirmek için kullanmak daha mantıklı. Yani sadece bir tablodan yapılacak select için view kullanmak yine mantıklı değildir.
SQL Table-Valued Functions – Tablo Fonksiyonları yazımızda bu kadarı dostlar.Diğer derslerimizde görüşmek üzere.
Microsoft SQL Server & T-SQL Eğitim Seti ders listesi için tıklayınız.
Sağlıcakla ve Takipte Kalın.