然后创建分页存储过程;这个是基于SQL 2005 的ROW_NUMBER的, SQL 2000 不适用; SQL 2008 我没有安装,所以也没有测试过!估计应该可以运行.
2种算法可以选择 1. 使用 BETWEEN ; 2. TOP ; 代码中已经注释了.
我测试了一下2种方法基本没有什么区别;代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | USE [DATA_TEMP] GO /****** 对象: StoredProcedure [dbo].[im531_Page] 脚本日期: 11/26/2010 10:52:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: im531 -- Create date: 2010-10-25 -- Description: SQL 2005 ROW_NUMBER 分页 -- Modify Date: 2010-10-26 -- ============================================= CREATE PROCEDURE [dbo].[im531_Page] @TabeName AS NVARCHAR(50), @Fields AS NVARCHAR(1024), @SearchWhere AS NVARCHAR(1024), @OrderFields AS NVARCHAR(1024), @pageNumber AS INT , @page AS INT AS BEGIN SET NOCOUNT ON ; DECLARE @sqlType AS TINYINT SET @sqlType = 0 -- 0 BETWEEN 1 TOP DECLARE @sql AS NVARCHAR( MAX ) IF @SearchWhere <> '' SET @SearchWhere = ' WHERE ' + @SearchWhere IF @page < 2 SET @page = 1 IF @page = 1 BEGIN SET @sql = 'SELECT TOP ' + CONVERT (NVARCHAR(20),@pageNumber) + ' ' + @Fields + 'FROM [' + @TabeName + '][a] WITH(NOLOCK) ' + @SearchWhere + ' ORDER BY ' + @OrderFields END ELSE BEGIN --临时表 SET @sql = ';WITH [Page_____Table] AS(' + 'SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderFields + ') AS [RowNow],' + @Fields + 'FROM [' + @TabeName + ' ][a] WITH(NOLOCK) ' + @SearchWhere + ')' --查找当前页面记录 IF @sqlType = 0 BEGIN -- A USE BETWEEN SET @sql = @sql + 'SELECT *' + 'FROM [Page_____Table] WITH(NOLOCK)' + 'WHERE [RowNow] BETWEEN ' + CONVERT (NVARCHAR(20),(@page - 1) * @pageNumber + 1) + ' AND ' + CONVERT (NVARCHAR(20),@page * @pageNumber) + 'ORDER BY [RowNow]' END ELSE BEGIN -- B USE TOP SET @sql = @sql + 'SELECT TOP ' + CONVERT (NVARCHAR(20),@pageNumber) + ' *' + 'FROM [Page_____Table] WITH(NOLOCK)' + 'WHERE [RowNow] > ' + CONVERT (NVARCHAR(20),(@page - 1) * @pageNumber) + 'ORDER BY [RowNow]' END END EXEC (@sql) END |