Sorgu Sonucunda Gelen Kayıtları Limitlemek ve Sayfalamak(OFFSET ve FETCH SQL Server Paging)
İstemci(Client)’ye sorgu sonucunun tamamını göndermek istemiyorsanız OFFSET ve FETCH yardımıyla sorgu sonucunun hangi satırından başlayıp kaç tane satırını döndüreceğini belirleyebilirsiniz.
Bir örnek yaparak çok daha kolay anlaşılabileceğini düşünüyorum. Aşağıdaki kod bloğunu inceleyelim.
İlk sorguda AdventureWorks2014Yeni veritabanındaki tüm kolanları City’ye göre sıralayarak select ediyoruz.
İkinci sorguda aynı sorgunun ilk 5 kaydı haricindeki diğer tüm kayıtları getiriyoruz.
Üçüncü sorguda da ilk kayıttan başlayarak yalnızca 10 kaydı getiriyoruz. Sorgu sonucunun her seferinde aynı gelmesi için sorgunun sonuna OPTION(MAXDOP 1) hint’ini koyuyoruz. Eğer koymazsak ve sorguda parallelism olursa sıralama her seferinde farklı olabiliyor.
SELECT * FROM [AdventureWorks2014Yeni].[dbo].[Address] Order By City ASC OPTION(MAXDOP 1)
SELECT * FROM [AdventureWorks2014Yeni].[dbo].[Address] Order By City ASC OFFSET 5 ROWS OPTION(MAXDOP 1);
SELECT * FROM [AdventureWorks2014Yeni].[dbo].[Address] Order By City ASC OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY OPTION(MAXDOP 1);
Kod içinde bir düzenlemeyle sayfalama yapmak için bu özellik kullanılabiliyor. Mesela aşağıdaki kod’da sayfa başına satır sayısı 10 iken 5.sayfayı getiriyoruz.
DECLARE @SayfaBasinaSatir INT = 10, @SayfaNumarasi INT = 5 SELECT * FROM [AdventureWorks2014Yeni].[dbo].[Address] Order By City ASC OFFSET @SayfaBasinaSatir * (@SayfaNumarasi-1) ROWS FETCH NEXT @SayfaBasinaSatir ROWS ONLY OPTION(MAXDOP 1);