Geriye tek bir değer dönen fonksiyonlardır. Daha kolay anlaşılması adına, küçük bir örnek üzerinde inceleme yapalım. AdventureWorks veritabanında, hangi ürününün kaç adet sipariş edildiği bilgisini elde etmek istediğimizi düşünelim. Ürünlerin sipariş bilgileri Sales.SalesOrderDetail tablosunda tutulmaktadır. Yazacağımız fonksiyon parametre olarak ProductID alsın ve geriye integer bir değer dönsün.
CREATE FUNCTION FN_OrderedProduct(@prodID INT)
RETURNS INT
AS
BEGIN
DECLARE @SONUC INT
SELECT @SONUC = SUM(OrderQty) FROM Sales.SalesOrderDetail
WHERE ProductID=@prodID
RETURN @SONUC
END
Fonksiyonumuzu çalıştırmak için ,
SELECT dbo.FN_OrderedProduct(776) --ID'si 776 olan ürün için
Yazdığımız fonksiyonu sorgu içerisinde de kullanabiliriz. Production.Product tablosundaki ürün adlarını ve kaç adet sipariş edildiğini gösterelim. Normal şartlarda bu işlemi join ile gerçekleştirebiliriz.
SELECT PP.Name,SUM(SOD.OrderQty) [Sipariş Adedi] FROM Production.Product PP
LEFT JOIN Sales.SalesOrderDetail SOD ON PP.ProductID=SOD.ProductID
GROUP BY PP.Name
Burada left join kullanmamızın sebebi, Production.Product tablosundaki bazı ürünlerin Sales.SalesOrderDetail tablosunda kaydının bulunmamasıdır. Dolayısı ile bu kolonlar null gelmektedir. null gelen kolonlar da diğer tablo ile eşleşememektedir. Eğer inner join yazsaydık tüm ürünleri elde edemezdik. Sadece Sales.SalesOrderDetail tablosunda kaydı olan ürünleri elde edebilirdik.
Yukarıdaki join işlemini, Sales.SalesOrderDetail tablsoundaki kayıtlara ulaşmak için gerçekleştirdik. Halbuki bizim yazdığımız fonksiyon zaten productID’ye göre ürünün kaç adet sipariş edildiği bilgisini getiriyordu. Dolayısı ile sorgumuzu şu şekilde de yazabiliriz,
SELECT Name,dbo.FN_OrderedProduct(ProductID) FROM Production.Product
Görüldüğü gibi, yazdığımız fonksiyonu sorgu içerisinde de kullanabildik. Bu 2 sorgunun ekran çıktıları birebir aynıdır.
Şimdi de başka bir örnek yapalım. Person.Contact tablosunda kişilere ait iletişim bilgileri tutulmaktadır. Parametre olarak contactID alan ve geriye o kişinin ünvan+ad+soyad olarak tam adını geriye dönen bir fonksiyon yazalım.
CREATE FUNCTION FN_GetFullName(@contactID INT)
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @FULLNAME VARCHAR(255)
SELECT @FULLNAME = ISNULL(Title,'') + ' ' + FirstName + ' ' + ISNULL(MiddleName,'') + ' ' + LastName FROM Person.Contact
WHERE ContactID=@contactID
RETURN @FULLNAME
END
Not: Title ve MiddleName kolonlarından NULL değerler gelebilir. Metinsel ifademizi + operatörü ile bağladığımızdan ötürü, bu değerlerden herhangi birinin NULL gelmesi, tüm datanın null gelmesine sebep olacaktır. Bu yüzden ISNULL fonksiyonunu kullandık.
ContactID’si 13 olan kişinin tam adını göstermek için,
SELECT dbo.FN_GetFullName(13) [FullName]
0 yorum:
Yorum Gönder