分頁的sql腳本是2013年大實訓的時候老師講的,今天把它整理出來。
數據庫就用Northwind數據庫。就用Orders表為例子吧,假設每頁都顯示10條記錄。
先從簡單的腳本開始吧。先取到第一頁的數據。
SELECT TOP 10 * FROM dbo.Orders
第二頁的數據
SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 10 OrderID FROM dbo.Orders)
第三頁的數據
SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 20 OrderID FROM dbo.Orders)
由此可以推斷出,第N頁的數據為
SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP (N-1)*10 OrderID FROM dbo.Orders)
寫成通用的SQL語句如下:
BEGIN DECLARE @PageSize INT --每頁顯示條數 DECLARE @PageIndex INT --頁碼(從1開始) SET @PageSize = 10 SET @PageIndex = 4 SELECT TOP ( @PageSize ) * FROM dbo.Orders WHERE OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize ) OrderID FROM dbo.Orders ORDER BY OrderID ASC ) ORDER BY OrderID ASCEND
寫成存儲過程如下:
--存儲過程CREATE PROCEDURE P_GetPagedOrders1 @PageSize INT , --每頁顯示條數 @PageIndex INT , --頁碼(從1開始) @RecordCount INT OUTPUT , --數據總數 @PageCount INT OUTPUT --總頁數AS BEGIN --獲取數據總數 SELECT @RecordCount = COUNT(1) FROM dbo.Orders --計算總頁數 SET @PageCount = @RecordCount / @PageSize IF @RecordCount % @PageSize > 0 BEGIN SET @PageCount = @PageCount + 1 END --獲取當前頁的數據 SELECT TOP ( @PageSize ) * FROM dbo.Orders WHERE OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize ) OrderID FROM dbo.Orders ORDER BY OrderID ASC ) ORDER BY OrderID ASC END
測試存儲過程
DECLARE @RecordCount INT , @PageCount INTEXEC dbo.P_GetPagedOrders1 @PageSize = 10, @PageIndex = 1, @RecordCount = @RecordCount OUTPUT, @PageCount = @PageCount OUTPUTSELECT @RecordCount AS N'@RecordCount' , @PageCount AS N'@PageCount'
測試結果如下
新聞熱點
疑難解答