MS-SQL Fonksiyonlar

  • 13
  • (1)
  • (5)
  • 15 Haz 2017

MS-SQL veritabanı üzerinde kullanılabilir birçok fonksiyon olduğu gibi kendi fonksiyonlarınızı da oluşturabilmektesiniz.

Fonksiyon Oluşturmak

TRecords veritabanı üzerinden bir örneği detaylı inceleyebilirsiniz. tabloUrunler içerisindeki ürünler aşağıdaki gibiydi.

MarkaID anahtarı ile bu tabloya bağlı olan tabloMarkalar tablosundaki markalar da aşağıdaki gibiydi.

Bir markaya ait ürünleri görmek için aşağıdaki sorguyu kullanırsınız. Örneğin MarkaID' si 8 olan MSI' a ait ürünler için...


select * from tabloUrunler
where MarkaID = 8

Sorgu size MarkaID' si 8 olan ürünleri döndürür.

Bu markaya ait kaç ürün olduğunu öğrenmek için de aşağıdaki sorgulardan birini kullanabilirsiniz.


select count(*) from tabloUrunler
where MarkaID = 8

Peki bir markaya ait kaç ürün olduğunu veren bir fonksiyon olabilir mi?


create function dbo.funcUrunSayisi (@_markaID int)
returns int
as
begin
	declare @_sonuc int
	select @_sonuc = count(*) from tabloUrunler where MarkaID = @_markaID
	return @_sonuc
end

Fonksiyonun geri dönüş değeri her zaman returns anahtar kelimesiyle belirtilir. Bu fonksiyon int bir değer döndürecektir. @_sonuc değişkenine tabloUrunler tablosundan MarkaID değeri @_markaID parametresine eşit olan satırların sayısı eşitleniyor. Ardından fonksiyonun geri dönüş değeri olarak dönüyor.

Bu fonksiyonu bir kere oluşturduktan sonra (create ve end arasını seçip F5 ile çalıştırın) değiştirmek için


alter function dbo.funcUrunSayisi (@_markaID int)
returns int
as
begin
	declare @_sonuc int
	select @_sonuc = count(*) from tabloUrunler where MarkaID = @_markaID
	return @_sonuc
end

alter anahtar kelimesi ile değiştirmeniz gerekmektedir. Oluşturulan bu fonksiyonu sorgu içinde kullanım şekilleriniz aşağıdaki gibidir.


select dbo.funcUrunSayisi(8)
-- MarkaID' si 8 olan ürünlerin sayısını doğrudan verir veya
select MarkaID, MarkaAdi, dbo.funcUrunSayisi(MarkaID) as UrunSayisi
from tabloMarkalar

tabloMarkalar içerisindeki her satır için bu fonksiyonu çalıştırıp hangi markanın kaç ürünü olduğunu görebilirsiniz.

Daha karmaşık bir örneğe kalkışılabilir. tabloUrunTurleri içerisindeki veri şu şekildedir.

UrunTuruID anahtarı tabloUrunler' deki UrunTuruID' ye bağlıdır. Aynı şekilde tabloMarkalar tablosundaki MarkaID anahtarı da yine tabloUrunler' deki MarkaID' ye bağlıdır.

Hangi ürün türünden kaç değişik marka olduğunu veren bir fonksiyon nasıl yazılabilir?

Öncelikle ürün türüne göre ürünleri şu şekilde sorgularsınız.


select * from tabloUrunler
where UrunTuruID = 1

Sadece MarkaID alanı işinize yarayacak, fakat kendini tekrarlamayan kayıtları getirmelisiniz. Aşağıdaki sorgu UrunTuruID' di 1 olan ve kendini tekrarlamayan MarkaID değerlerini verir.


select distinct MarkaID from tabloUrunler
where UrunTuruID = 1

Bu değerlerin sayısını hesaplamak için doğrudan count(MarkaID) yapamazsınız. Çünkü toplamdaki satır sayısını verecektir. Birbiri ile aynı olmayan değerleri ikinci bir sorgu ile count içerisine dahil edebilirsiniz.


select distinct MarkaID from tabloUrunler
where UrunTuruID = 1
-- Bu sorguya a alias ı verip sonuçları saydırabilirsiniz

select count(a.MarkaID) from (
select distinct MarkaID from tabloUrunler
where UrunTuruID = 1) a

Bu daha karmaşık bir yöntemdir. Daha basit bir yöntem olarak distinct anahtar kelimesini doğrudan count içinde kullanabilirsiniz de.


select count(distinct MarkaID) from tabloUrunler
where UrunTuruID = 1

Bu sorguyu fonksiyon haline getirmek için aşağıdaki sorguyu çalıştırmanız yeterlidir.


create function dbo.funcTurMarkaSayisi (@_urunTuruID int)
returns int
as
begin
	declare @_sonuc int
	select @_sonuc = count(distinct MarkaID) from tabloUrunler
	where UrunTuruID = @_urunTuruID
	return @_sonuc
end

Fonksiyonu sorgu içerisinde çalıştırıp hangi türe ait kaç marka olduğunu öğrenebilmek için de şöyle bir sorgu kullanacaksınız.


select UrunTuruID, TurAdi,
	dbo.funcTurMarkaSayisi(UrunTuruID) as MarkaSayisi
from tabloUrunTurleri

İlişkili İçerikler

Tek bir prosedürle birden fazla sorguyu tek seferde çalıştırabilir ve çeşitli işlemleri gerçekleştirebilirsiniz.

Paylaşın
Etiket Bulutu