msHOWTO

29 Nisan 2012 Pazar

T-SQL ile SQL Pagging

Merhaba arkadaşlar.Bu makalemde oldulça önemli ve çok yararlı işlem olam pagging yani sayfalamanın nasıl yapılacağını anlatacağım.Ama öncelikle sayfalamanın yararını iyice anlamamız gerekmektedir.Neden kullanılır? Diyelim ki milyonlarca kayıtın olduğu bir tablonuz var ve sorgu çekerek işlem yapacaksınız.Ve aradığınız verinin tahmini olarak nerelerde olduğunu biliyorsunuz.Neden tablodaki tüm kayıtlara sorgu çekeceksiniz ki o zaman.Gereksiz bekleme ve performans kaybı yaşarsınız.Fakat tablodaki tüm kayıtları istediğiniz sayıda sayfalama yaparsanız ve sorgunuzu bir kaç sayfaya atıp hemen sonuç elde etmek müthiş bir şey değil mi ? Bence evet.Hadi bu işlemin nasıl yapıldığına bakalım.

Öncelikle tüm kayıtları bir elde edelim .


SELECT * FROM dbo.Products

Daha sonra ise bu verileri bir şekilde ve benim istediğim türde sıralama yapmam gerekiyor.

SELECT * FROM dbo.Products ORDER BY ProductName

Bu işlemide yaptıktan sonra düşünmem gereken şu ki benim sayfalama yapmam için ve bir sayfada kaç kayıt gözükeceğini belirlemem lazım.Bunun için akla ilk gelen id kolonlarına bakmak olacaktır.Fakat unutulmaması gereken eğer silinen veri varsa düzgün sonuç alamayız.Id kolonundaki değerlerin üzerinden yola çıkamam.Onun için de kendi algoritmamı yazmam gerekmektedir.

DECLARE     @PageSize INT,
      @PageNumber INT,
      @FirstRow INT,
      @LastRow INT

SELECT      @PageSize = 10,
      @PageNumber = 2

SELECT      @FirstRow = ( @PageNumber - 1) * @PageSize + 1,
      @LastRow = (@PageNumber - 1) * @PageSize + @PageSize ;

Olarak algoritmamı yani bir sayfada kaç kayıt varsa ona göre verileri sayfalara ayırmak için gereken değerlerimi elde ettim.Şimdi yapmam gereken şudur.Eğer ben id kolonundan yola çıkamıyorsam kendim öyle bir kolon oluşturmam gerekir ki elde edilen satırlara otomatik sıra numarası atasın.Bu işlem için de Row_Number() over(Sıralı bir kolon) kodlarından yararlanmam gerekir.

select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products

Olarak sıraları otomatik veren kolonumu da oluşturdum.Şimdi sıra geldi bu sorgudan tablo olarak dönen verilere where filtreleme kodu ile istediğim değerler arasındaki verileri çekmeye.

select * from (select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products) Products where (SatirNo between  3 and 15)

Bu işlemi de yaptıktan sonra  3 ile 15 değeri yerine yukarıda bulduğum firstrow ve LastRow değişkenlerini verirsem işlemim tamamlanacaktır.

select * from (select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products) Products where (SatirNo between  @FirstRow and @LastRow)

Parça parça anlattıktan sonra tam olarak sorgumuzu bir görelim .

DECLARE     @PageSize INT,
      @PageNumber INT,
      @FirstRow INT,
      @LastRow INT

SELECT      @PageSize = 10,
      @PageNumber = 2

SELECT      @FirstRow = ( @PageNumber - 1) * @PageSize + 1,
      @LastRow = (@PageNumber - 1) * @PageSize + @PageSize ;

select * from (select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products) Products where (SatirNo between  @FirstRow and @LastRow)




Umarım faydalı olmuştur arkadaşlar.Bir sonraki makalemde görüşmek dileğiyle.







Hiç yorum yok:

Yorum Gönder