İlginizi Çekebilir
  1. Ana Sayfa
  2. SQL

SQL Table-Valued Functions – Tablo Fonksiyonları

SQL Table-Valued Functions – Tablo Fonksiyonları
+ - 0

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

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)