MS-SQL Fonksiyonlar
- 157
- (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.