Wednesday, August 20, 2014

Pagination in SQL SErver with and without OFFSET

http://blog.sqlauthority.com/2013/04/14/sql-server-tricks-for-row-offset-and-paging-in-various-versions-of-sql-server/


SQL SERVER – Tricks for Row Offset and Paging in Various Versions of SQL Server


Paging is one of the most needed tasks when developers are developing applications. SQL Server has introduced various features of SQL Server 2000 to the latest version of SQL Server 2012. Here is the blog post which I wrote which demonstrates how SQL Server Row Offset and Paging works in various versions of the SQL Server. Instead of giving the generic algorithm, I have used AdventureWorks database and build a script. This will give you better control over your data if you have installed the AdventureWorks database and you can play around with various parameters.
The goal is to retrieve row number 51 to 60 from the table Sales.SalesOrderDetails of database AdventureWorks.
You can install the AdventureWorks database and you can run following queries based on your version.
USE AdventureWorks2012
GO
--------------------------------------------------
-- SQL Server 2012
--------------------------------------------------

DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderDetailID
OFFSET (@PageNumber-1)*@RowsPerPage ROWS --OffSet is used to skip that much number of rows
FETCH NEXT @RowsPerPage ROWS ONLYGO
--------------------------------------------------
-- SQL Server 2008 / R2
-- SQL Server 2005
--------------------------------------------------

DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM (SELECT SalesOrderDetailID, SalesOrderID, ProductID,ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
FROM Sales.SalesOrderDetail ) AS SOD
WHERE SOD.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
AND @RowsPerPage*(@PageNumber)GO
--------------------------------------------------
-- SQL Server 2000
--------------------------------------------------

DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM(SELECT TOP (@RowsPerPage)SalesOrderDetailID, SalesOrderID, ProductID
FROM(SELECT TOP ((@PageNumber)*@RowsPerPage)SalesOrderDetailID, SalesOrderID, ProductID
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderDetailID
) AS SOD
ORDER BY SalesOrderDetailID DESC) AS SOD2
ORDER BY SalesOrderDetailID ASCGO

I am sure there are better and efficient ways but the tricks demonstrated above just works. Please feel free to leave a comment with your suggestions.

No comments:

Post a Comment