SQL Table-Valued Functions – Tablo Fonksiyonları

SQL Table-Valued Functions – Tablo Fonksiyonları

6 Eylül 2018 1 Yazar: Mustafa BÜKÜLMEZ
Toplam Görüntülenme : 158
Yaklaşık okuma süresi : 4 DK
SQL Scalar-Valued Functions - Değer Fonksiyonları
SQL Server Deadlock Nedir? Yanlış Bilinenler
SQL Table-Valued Functions – Tablo Fonksiyonları
5 (100%) 2 Oy

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.

İlgili İçerik  Microsoft SQL Server 2014 Express Kurulumu

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. 😉

SQL Scalar-Valued Functions - Değer Fonksiyonları
SQL Server Deadlock Nedir? Yanlış Bilinenler
Mustafa Bükülmez

Liseden, Ağ Sistemleri ve Yönetimi bölümünden mezun oldum. Üniversiteden (2 yıllık), Bilgisayar Programcılığı bölümünden mezun oldum. Şuanda da AÖF, Yönetim Bilişim Sistemleri bölümünde okumaktayım.

İlgili İçerik  C# DevExpress GridView Grup Başlık Renklendirme

Uzmanlık alanlarım; Windows Sistemleri, HTML, CSS, C# ve SQL’dir.

Hobi olarak uğraştığım genel konular, Photoshop, After Affects, Corel Draw’dır.Film, YABANCI dizi, Anime izlemeyi ve Manga okumayı severim. Arkadaşlarımla yürüyüş yapmayı ve grup olarak aktivitelere gitmeyi severim. Geri kalan zamanlarımın tümü bilgisayar karşısında geçer.