SQL PROCEDURE MACERASI -7
Peki bir soru daha soralım. MSSQL üzerinden veri sorgularken (ASP, .Net) sayfa sayfa veri almamızı sağlayan. Pagesize,
.AbsolutePage gibi fonksyionlar Stored Procedure üzerinde kullanılabilir mi?
Bunu acı bir deneyim ile programım hata verdiğinde öğrenmiştim. Prosedür Server üzerinde çalışıyordu ama program kodlarında
sayfalama kısmına geldiğinde hata veriyordu. Sonradan öğrendim ki bu fonksiyonlar ile Stored Procedure kullanılamıyormuş.
O zaman bu işlem için farklı bir metod izlenmeliydi. Ama nasıl?
İşte kodlar;
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— =============================================
— Author: Burak SEKERCIOGLU
— Create date: 12/05/2011
— Description: SP TEST-7
— =============================================
CREATE PROCEDURE [sp_test] (@tip int, @maxkayit int, @sayfa int)
AS
— =============================================
— Sayfalama Fonksiyonu için tanımlar yapılıyor
— =============================================
declare @kucukAralik int
declare @buyukAralik int
set @kucukAralik = (@sayfa-1) * @maxkayit
set @buyukAralik= (@sayfa*@maxkayit)
— =============================================
BEGIN
SET NOCOUNT ON;
if @tip=1
begin
SELECT * FROM (
SELECT row_number() over (order by kno) as rowid,
webadresi,
epostaadresi,
kurumunvani,
sicilno,
grupkodu,
durumbilgisi,
istihdam,
marka,
urunler,
sektor,
adres
FROM
kurumex LEFT OUTER JOIN sektorler ON kurumex.sektor = sektor.id
RIGHT OUTER JOIN kurumlar ON kurumex.kno = kurum.kno
WHERE (kurumex.sanayi = 1) ) AS sonuclar
WHERE sonuclar.rowid between @kucukAralik and @buyukAralik
end
if @tip=2
begin
SELECT * FROM (
SELECT row_number() over (order by kurumno) as rowid,
webadresi,
epostaadresi,
kurumunvani,
sicilno,
grupkodu,
durumbilgisi,
istihdam,
marka,
urunler,
sektor,
adres
FROM
kurumex LEFT OUTER JOIN sektorler ON kurumex.sektor = sektor.id
RIGHT OUTER JOIN kurumlar ON kurumex.kno = kurum.kno
WHERE (kurumex.ithalat = 1) ) AS sonuclar
WHERE sonuclar.rowid between @kucukAralik and @buyukAralik
end
if @tip=3
begin
SELECT * FROM (
SELECT row_number() over (order by kno) as rowid,
webadresi,
epostaadresi,
kurumunvani,
sicilno,
grupkodu,
durumbilgisi,
istihdam,
marka,
urunler,
sektor,
adres
FROM
kurumex LEFT OUTER JOIN sektorler ON kurumex.sektor = sektor.id
RIGHT OUTER JOIN kurumlar ON kurumex.kno = kurum.kno
WHERE (kurumex.ihracat = 1) ) AS sonuclar
WHERE sonuclar.rowid between @kucukAralik and @buyukAralik
end
END
Bu şekilde yaptığımızda neler oluyor, inceleyelim.
CREATE PROCEDURE [sp_test] (@tip int, @maxkayit int, @sayfa int)
AS
— =============================================
— Sayfalama Fonksiyonu için tanımlar yapılıyor
— =============================================
declare @kucukAralik int
declare @buyukAralik int
set @kucukAralik = (@sayfa-1) * @maxkayit
set @buyukAralik= (@sayfa*@maxkayit)
— =============================================
Daha önceden de anlattığımız gibi dışarıdan parametrik @tip, @maxkayit ve @sayfa verilerini alıyoruz.
Sonrasında ise bu verileri kullanarak gösterilmek istenen kayıt satır aralıklarını DECLARE ile belirtilen değişkenlere SET ile
tanımlıyoruz.
Şöyle ki;
Exec sp_test 1,10,2
ile sp_test prosedürüne değişkenlerimizi gönderdiğimizde sistem
@tip = 1
@maxkayit=10
@sayfa=2
Değerlerini alıyor. Sonrasında ise
set @kucukAralik = (@sayfa-1) * @maxkayit
set @buyukAralik= (@sayfa*@maxkayit)[/box]
Satırlarındaki tanımlara göre
@kucukAralik= (2-1) * 10
@buyukAralik=(2*10)
Oluyor ve recordset çıktımızın 10 ile 20. Kayıtlar arasında gösterilmesi sağlanıyor.
Peki kayıtların satır numaralarını neye göre belirliyoruz?
[box]
SELECT distinct(kurumno),* FROM (
SELECT row_number() over (order by kno) as rowid,
[/box]
Yukarıda göreceğiniz gibi iç içe 2 adet select yapısı kullanıyoruz ve en içteki kısımda da row_number() over (order by kno) as
rowid
ile listelenen kayıtların sıra numaralarını rowid kolonunda gösteriyoruz.
Buraya kadar herşey normal ama neden içiçe sorgu yarattık? diyenleriniz olabilir. Bunun sebebi de sorgumuzun satır aralığını
gösterirken Where rowid … şeklindeki alias ifadeleri kullanamayız ama içiçe yaratılan sorgulardan oluşan
ifadelerde bunu
[box]
) AS sonuclar
WHERE sonuclar.rowid between @kucukAralik and @buyukAralik
[/box]
Şeklinde bir sonuclar dizisine aktarıp sonra bu diziye ait sonuclar.rowid kolonları kullanılarak istenen sonuçlara ulaşabiliyoruz.
Nasıl, gittikçe Prosedürler hakkında daha keyifli bilgilere sahip oluyoruz değil mi? Daha bitmedi
Şimdi de şöyle düşünelim;
Devamı SQL Procedure Macerası -8