Anasayfa | Hakkımda | Kitaplarım | RSS Site içinde
Kategoriler
» SQL Server 2012
» SQL Server 2008
» C#
» MySQL
» Hayata Dair
» Güncel Haber-Duyuru
» Bir Soru Bir Cevap
» Oracle ve Diğer VTYS
» Java

SQL Server 2012'de Kayıtları Sayfalandırmak

20.12.2011 00:00:00
MySQL’de kullanımı çok pratik bir ifade vardır: LIMIT. Oldukça kolay kullanımlı bu ifadeyi yıllarca, SQL Server'da neden böyle bir şey yok ki diye imrenerek kullandım. Birçoklarınız LIMIT yerine TOP ifadesi veya @@ROWCOUNT parametresi ile bu işi kolayca yapabileceğimi söyleyecektir. Aslında pek de haksız sayılmazsınız ama kayıtları sayfalar halinde listelemek için LIMIT kullanımını @@ROWCOUNT veya TOP(n) ifadesi tek başlarına karşılayamaz.

SQL Server 2005’den itibaren eklenen Rütbeleme Fonksiyonları(Ranking Function) bir nebze sayfalama amaçlı kullanılabilir. Ama performans amaçlı daha etkin bir yola yazılımcıların gereksinimi vardı. SQL Server 2012 ile birlikte ANSI standardına paralel olarak SQL Server özelliklerine eklenen sayfalama desteği, MySQL'de yer alan LIMIT deyimini aratmıyor. OFFSET ve FETCH ifadeleri desteği ile istenilen kayıttan itibaren, istenilen kadar kaydı okumak mümkün

OFFSET, bilgisayar dünyasında belli bir noktaya olan uzaklık anlamına geliyor. TDK’ya göre Türkçe karşılığı “Göreli Konum” olarak önerilmiş. OFFSET deyimi, baştan belli sayıda kaydı “es geçmek” için kullanılabilir.

Şekil -1: OFFSET ve FETCH kelimelerinin işlevleri.

Örnek:
İlk 100 üründen sonraki ürünleri listelemek istersek:
SELECT urunKod,urunAd,listeFiyat
FROM tblUrun
ORDER BY urunKod
OFFSET 100 ROWS

Şekil -2: OFFSET kelimesi ile baştan belli sayıda kaydı atlayarak görüntülemek

Ürünleri, ürün kodları ile sıraladıktan sonra, ilk 100 kaydı atladık ve sonraki kayıtları listelemiş olduk. Bu liste oldukça uzun. Çünkü henüz kayıtları sayfa sayfa seçme işlemini yapmadık. Kayıtları sayfalandırırken temel iki nokta olarak, hangi kayıttan itibaren okunacağı ve bir sayfada kaç kayıt olacağına karar vermek gerekir.

Örnek:

FETCH ise getirilecek kayıtların sayısını belirler. İlk 100 üründen sonra takip eden 10 tane ürün getirecek bir sorgu şu şekilde yazılabilir:

SELECT urunKod,urunAd,listeFiyat
FROM tblUrun
ORDER BY urunKod
OFFSET 100 ROWS
FETCH FIRST 10 ROWS ONLY

FETCH FIRST 10 ROWS ONLY ifadesi 100 kayıt geçildikten sonra takip eden 10 kaydın alınacağını göstermekte. Bu ifade ANSI uyumlu olarak

SELECT urunKod,urunAd,listeFiyat
FROM tblUrun
ORDER BY urunKod
OFFSET 100 ROWS
FETCH NEXT 10 ROW  ONLY

FIRST yerine NEXT ve ROWS yerine ROW kelimelerinin geldiğine dikkat edelim. Bu kelimeler sadece standartlara uyum amacıyla desteklenmete ve herhangi bir işlevsellik farkı oluşturmamaktadır.

İPUCU:
OFFSET ve FETCH FIRST kelimelerinden sonra verilen değerleri dinamik değişkenler aracılığıyla da belirlemek mümkündür. Bu, programatik öğeler kodlarken esneklik sağlayan bir özelliktir.

Örnek:
Her sayfada 10 kayıt olmak üzere 4.sayfadaki ürünleri listeleyecek bir sorgu şu şekilde yazılabilir:

USE dukkan;
 
DECLARE @gecerliSayfa  INT =1;
DECLARE @sayfadakiKayitSayisi INT = 10;
DECLARE @baslamaNoktasi INT = (@gecerliSayfa - 1) * @sayfadakiKayitSayisi;
 
 
SELECT urunKod,markaKod,urunAd
FROM tblUrun
ORDER BY urunKod
--
OFFSET    @baslamaNoktasi ROWS
FETCH NEXT    @sayfadakiKayitSayisi ROWS ONLY;

Aynı yapıyı bir stored procedure olarak da şu şekilde kodlamak mümkündür:

USE dukkan;
 
CREATE PROCEDURE _spSayfaliUrunListele(
@gecerliSayfa INT =1,
@sayfadakiKayitSayisi INT=10
)
AS
      DECLARE @baslamaNoktasi INT
        = (@gecerliSayfa - 1) * @sayfadakiKayitSayisi;
 
 
      SELECT urunKod,markaKod,urunAd
      FROM tblUrun
      ORDER BY urunKod
      --
      OFFSET    @baslamaNoktasi ROWS
      FETCH NEXT    @sayfadakiKayitSayisi ROWS ONLY;
GO
Tanımlanan prosedür şu şekilde çağrılabilir.
exec _spSayfaliUrunListele 1,100;

Şekil -3: Ürünleri her sayfada 10 ürün olmak üzere 2.sayfasındaki ürünlerin listesini getiren prosedür.

Sonuç olarak OFFSET-FETCH yapısı, kolayca sayfalandırma yapmak için tercih edilebilir.


Konuya müdahil olmak ister misiniz?
Başlık:  
İsim  :  
URL   :
Yorum