会员登录 用户名: 密码: 登录 新会员注册 [找回密码]
当前位置:编程论坛 >> 数据库技术专区 >> SQL Server 论坛 >> [分享]用存储过程实现分页 功能 - SQL Server 论坛
首页
中资源
  发表一个新主题  发表一个新投票  回复主题 您是本帖的第 136 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
 * 贴子主题:[分享]用存储过程实现分页 功能 报告本帖给版主  显示可打印的版本  把本贴打包邮递  把本贴加入论坛收藏夹  发送本页面给朋友  把本贴加入IE收藏夹 
 skypro 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:377
  专家分:0
  提问帖:0/0
  回答帖:2
  总帖数:1
  经验值:59
  注 册:2008-11-20
给skypro发送一个短消息 把skypro加入好友 查看skypro的个人资料 搜索skypro在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子楼主

发贴心情 [分享]用存储过程实现分页 功能


if exists (select name from sysobjects where name ='sp_page')
drop proc sp_page
go
 
create proc 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 ( 记录个数 / 页大小 )

  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

declare @intPageCount int

exec sp_page 'Alarm1','Id',0,0,'*',20,1,'',@intPageCount output

drop proc sp_page

发帖:2008-11-20 13:35:00
  鲜花(0)  鸡蛋(0)

本主题贴数1,分页:[返回帖子列表] [上一页] [1] [下一页]
 *快速回复:[分享]用存储过程实现分页 功能  [ 回帖是一种美德 :) ]
会员账号 用户名    还没注册?    密码    忘记密码?
内容
  • HTML标签: 不可用
  • UBB标签: 可用
  • 贴图标签: 可用
  • 多媒体标签:可用
  • 表情字符转换:可用
  • 上传图片:不可用
  • 最多15KB
  • 点击表情图即可在帖子中加入相应的表情
                                
    邮件回复 显示签名   [Ctrl+Enter直接提交贴子]

    管理选项锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告