SqlServer2005分页存储过程的实现

楼主
我是社区第238588位番薯,欢迎点我头像关注我哦~
1.描述

直接使用数据集可以实现分页查询,下面我们要做的就是如何定义分页存储过程即直接在存储过程中实现分页查询了。

2.通用的分页存储过程1.1 存储过程

具体代码如下:

  1. CREATE proc [dbo].[up_Page2005]
  2. @TableName varchar(50),        --表名
  3. @Fields varchar(5000) = '*',    --字段名(全部字段为*)
  4. @OrderField varchar(5000),        --排序字段(必须!支持多字段)
  5. @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
  6. @pageSize int,                    --每页多少条记录
  7. @pageIndex int = 1 ,            --指定当前为第几页
  8. @TotalPage int output            --返回总页数
  9. as
  10. begin
  11.     Begin Tran --开始事务
  12.     Declare [url=home.php?mod=space&uid=19426]@sql[/url] nvarchar(4000);
  13.     Declare @totalRecord int;   
  14.     --计算总记录数
  15.     if (@SqlWhere='' or @sqlWhere=NULL)
  16.         set @sql = 'select @totalRecord = count(*) from ' + @TableName
  17.     else
  18.         set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere
  19.     EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT --计算总记录数      
  20.     --计算总页数
  21.     select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
  22.     if (@SqlWhere='' or @sqlWhere=NULL)
  23.         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName
  24.     else
  25.         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere   
  26.         

  27.     --处理页数超出范围情况
  28.     if @PageIndex<=0
  29.         Set @pageIndex = 1
  30.    
  31.     if @pageIndex>@TotalPage
  32.         Set @pageIndex = @TotalPage

  33.      --处理开始点和结束点
  34.     Declare @StartRecord int
  35.     Declare @EndRecord int
  36.    
  37.     set @StartRecord = (@pageIndex-1)*@PageSize + 1
  38.     set @EndRecord = @StartRecord + @pageSize - 1

  39.     --继续合成sql语句
  40.     set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
  41.      print @sql   
  42.     Exec(@Sql)
  43.     ---------------------------------------------------
  44.     If @@Error <> 0
  45.       Begin
  46.         RollBack Tran
  47.         Return -1
  48.       End
  49.      Else
  50.       Begin
  51.         Commit Tran
  52.         Return @totalRecord ---返回记录总数
  53.       End   
  54. End
复制代码

1.2 测试分页

点击模板>模板数据集或者直接在数据集面板中,点击+号,添加一个存储过程,切换到 SQLServer 数据库所在的数据连接,双击所需要添加的存储过程,如下图:

点击预览,需要输入参数,如下图:

输入参数后,点击确定,返回两个数据集,如下图:

3.确定 SQL 及每页显示条数的分页存储过程3.1 存储过程

若已经确定了需要分页的表,字段,排序字段及每页显示记录数,可以不定义这几个参数,如下的例子是已知表名为 orders,让其按照 orderno 列进行排序并一页显示 10 条数据:

具体代码如下:


3.2 测试分页

点击模板>模板数据集或者直接在数据集面板中,点击+号,添加一个存储过程,切换到 SQL Server 数据库所在的数据连接,双击所需要添加的存储过程,如下图:

点击预览,需要输入参数,如下图:

输入参数后,点击确定,返回两个数据集,如下图:

注:在调用存储过程时,需要设置下 pageIndex 这个参数的默认值,否则会提示‘每页返回结果集’的错误。

4.SQL Server2012分页存储过程

注:上述第二种分页方式,在SQL Server 2012版本以后,有更加简单的实现方式。

具体实现如下所示:

4.1 存储过程

同上述第二种分页方法,已经确定了需要分页的表,字段,排序字段及每页显示记录数,如下的例子是已知表名为 yjcksjb,让其按照 x_jsdh 列进行倒序排列并一页显示 10 条数据:

具体代码如下:

  1. create procedure dbo.test5
  2. @pagesize AS BIGINT = 10,
  3. @pagenum AS BIGINT = 4
  4. AS
  5. BEGIN
  6. SET nocount ON
  7. SELECT *
  8. FROM yjcksjb
  9. ORDER BY x_jsdh DESC
  10. OFFSET (@pagenum-1) * @pagesize ROWS
  11. FETCH NEXT @pagesize ROWS ONLY
  12. set nocount off
  13. end
复制代码
4.2 测试分页

点击模板>模板数据集或者直接在数据集面板中,点击+号,添加一个存储过程,切换到SQL Server 数据库所在的数据连接,双击所需要添加的存储过程,如下图:


点击预览,需要输入参数,如下图:


输入参数后,点击确定,返回数据集,如下图:


分享扩散:
参与人数 +1 F豆 +1 理由
帆软最亮的仔 + 1 骚年,我看好你哦

查看全部评分

沙发
发表于 2021-6-3 14:37:12
全文看完了,那么如何和报表界面的下一页按钮联动,以及如何在导出时导出全部数据呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1回帖数 1关注人数 7900浏览人数
最后回复于:2021-6-3 14:37

返回顶部 返回列表