然后创建分页存储过程;这个是基于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 ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: im531 -- Create date: 2010-10-25-- Description: SQL 2005 ROW_NUMBER 分页-- Modify Date: 2010-10-26-- =============================================CREATE PROCEDURE [dbo].[im531_Page] @TabeNameAS NVARCHAR(50), @FieldsAS NVARCHAR(1024), @SearchWhereAS NVARCHAR(1024), @OrderFieldsAS NVARCHAR(1024), @pageNumberAS INT, @pageAS INTASBEGIN SET NOCOUNTON; DECLARE @sqlTypeAS TINYINT SET @sqlType = 0 -- 0 BETWEEN 1 TOP DECLARE @sqlAS 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 |