[返回首页]
 ◎ 您当前的位置:首页 >> 站长学堂 >> 数 据 库 >> MSSQL >> 正文
MS SQL Server 2005 开发之分页存储过程
作者:未知 来源:网上收集 发布时间:2007-3-24 2:49:46 浏览次数: 0732402502153659

在工作中经常会用到分页显示数据,如果使用.NET开发,可以使用DataGrid控件的分页功能,也可以使用PagedDataSource类来辅助完成。但这两种方式都将从数据库中获取所有的记录,将记录数目较大时,效率很低,因此直接使用存储过程来进行分页,则将会提供更好的性能。在CSDN的数据库开发社区,有许多大侠都写出了自己的分页存储过程,经过整理之后,给一个完整的例子。
首先创建一个分页存储过程,下面的分页存储过程是在pbsql大侠提供的分页存储过程的基础上改而成的。
 CREATE   PROCEDURE   sp_page  
    @strTable       varchar(50),   --表名  
    @strColumn      varchar(50),   --按该列来进行分页  
    @intColType     int,           --@strColumn列的类型,0-数字类型,1-字符类型,2-日期时间类型  
    @intOrder       bit,           --排序,0-顺序,1-倒序  
    @strColumnlist varchar(800), --要查询出的字段列表,*表示全部字段  
    @intPageSize    int,           --每页记录数  
    @intPageNum     int,           --指定页  
    @strWhere       varchar(800), --查询条件  
    @intPageCount   int   OUTPUT   --总页数  
 AS  
  DECLARE   @sql    nvarchar(4000) --用于构造SQL语句
 DECLARE   @where1 varchar(800)   --构造条件语句
 DECLARE   @where2 varchar(800)   --构造条件语句
 IF   @strWhere   is   null   or   rtrim(@strWhere)=''  
 -- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格
 BEGIN  --没有查询条件  
      SET   @where1=' WHERE '  
      SET   @where2=' '  
 END  
 ELSE  
 BEGIN  --有查询条件  
      SET   @where1=' WHERE ('+@strWhere+') AND '
      SET   @where2=' WHERE ('+@strWhere+') '  
 END  
  set @strColumn = ' ' + @strColumn + ' '
 set @strColumnlist = ' ' + @strColumnlist + ' '
 --构造SQL语句,计算总页数。计算公式为 总页数 = Ceiling ( 记录个数 / 页大小 ) http://www.knowsky.com
 SET   @sql='SELECT   @intPageCount=CEILING((COUNT(*)+0.0)/'
        + CAST(@intPageSize   AS   varchar)
        + ')   FROM   ' + @strTable + @where2  
 --执行SQL语句,计算总页数,并将其放入@intPageCount变量中
 EXEC sp_executesql @sql,N'@intPageCount   int   OUTPUT',@intPageCount   OUTPUT
 --将总页数放到查询返回记录集的第一个字段前,此语句可省略
 SET  @strColumnlist= Cast(@intPageCount as varchar(30)) + ' as PageCount,' + @strColumnlist  
 IF   @intOrder=0   --构造升序的SQL
      SET @sql='SELECT TOP '+ CAST(@intPageSize   AS   varchar) +
               @strColumnlist +  
               ' FROM ' + @strTable + @where1 +
               @strColumn + '>(SELECT MAX('+@strColumn+') '+  
               ' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS  varchar) +  
               @strColumn + ' FROM '+ @strTable+@where2+'ORDER BY '+@strColumn+') t) ORDER BY '+ @strColumn  
 ELSE              --构造降序的SQL  
      SET @sql='SELECT TOP '+ CAST(@intPageSize   AS   varchar) +
               @strColumnlist+  
               ' FROM '+ @strTable + @where1 +
               @strColumn + '<(SELECT   MIN('+@strColumn+')   '+  
               ' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS  varchar) +  
               @strColumn + ' FROM '+ @strTable+@where2+'ORDER   BY '+@strColumn+'   DESC)   t)   ORDER   BY   '+  
               @strColumn + ' DESC'       
 IF   @intPageNum=1--第一页  
      SET   @sql='SELECT   TOP   '+CAST(@intPageSize   AS   varchar) + @strColumnlist + ' FROM '+@strTable+  
                 @where2+'ORDER   BY   '+@strColumn+CASE   @intOrder WHEN  0 THEN  '' ELSE  ' DESC'
 END  
 --PRINT   @sql  
 EXEC(@sql)  
 GO  
 
下面创建一个数据表,进行测试,并向表中添加123个测试数据。
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[myUser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[myUser]
GO
CREATE TABLE [dbo].[myUser] (
     [UserId] [int] IDENTITY (1, 1) NOT NULL ,
     [UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
declare @i int
set @i=1
while ( @i <= 123 )
 begin
    insert into myUser (UserName) values ( 'test' + cast(@i as varchar(6)))
    set @i = @i + 1
 end
 调用存储过程
declare   @o   int  
exec   sp_page   'myUser','UserId',0,0,'*',15,1,'',@o   output  
exec   sp_page   'myUser','UserId',0,0,'*',15,9,'',@o   output  
如果在.Net中,可以使用输出参数。下面给出C#的从存储过程中输出参数的例子
    ......
    int iPage=1;
    SqlCommand cmd = new SqlCommand("sp_page", conn );
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@strTable", "myUser");
    cmd.Parameters.Add("@strColumn", "UserId");
    cmd.Parameters.Add("@intColType", 0);
    cmd.Parameters.Add("@intOrder", 0);
    cmd.Parameters.Add("@strColumnlist", "*");
    cmd.Parameters.Add("@intPageSize", 15);
    cmd.Parameters.Add("@intPageNum", iPage);
    cmd.Parameters.Add("@strWhere", "");
    SqlParameter paramPageCount = cmd.Parameters.Add("@intPageCount", SqlDBType.Int);
    paramPageCount.Direction = ParameterDirection.Output;
    //可以改为ExecuteReader()
    cmd.ExecuteNonQuery();
    Response.Write(paramPageCount.Value.ToString());
http://blog.csdn.net/mengyao/archive/2007/02/16/1511276.aspx

[返回上一页] [打 印]
热点文章 推荐文章 相关信息
·Access转MS SqlServer的注意事项
·如何把ACCESS转成SQL数据库
·MySQL和SQLServer的比较
·有关MySQL下载、安装和使用入门笔记
·远程SQL SERVER服务器备份数据到客户
·MS SQL Server 2005 开发之分页存储过
·Sql Server2005学习日记(01)
·关于Sql Server 2000 Analysis Servi
·Sql Server2005登录失败
·SQL SERVER数据导成INSERT
·扩展微软 SQL Server 的空间功能
·如何清除SQL日志