就我而言写代码最烦的就是处理数据,其中之一就是分页的使用。

有的代码写多了,总结出一套适用自己的分页方法;有的查一下资料借鉴一下套用起来也达到目的。

那么小编在这里给大家总结几个方法供大家做一下参考。

分页方法一:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO/*********************************************************
* 作    用:数据分页
* 作    者:Ozawa
* 作者博客:https://www.cnblogs.com/xiongze520/
* 创建日期:2019-05-13
* 使用说明:--调用例子:--1.单表/单排序EXEC proc_DataPagination @TableNames='bigtable',@PrimaryKey='d_id',@Fields='d_id,d_title,d_content,d_time',@PageSize=20,@CurrentPage=1,@Filter ='',@Group='',@Order='d_id desc'--2.单表/多排序EXEC proc_DataPagination 'bigtable','d_id','*',20,0,'','','d_time asc,d_id desc'--3.多表/单排序EXEC proc_DataPagination 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_id asc'--4.多表/多排序EXEC proc_DataPagination 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_time asc,bigtable.d_id desc'*********************************************************/  CREATE PROCEDURE [dbo].[proc_DataPagination]
@TableNames VARCHAR(200),    --表名,可以是多个表,但不能用别名
@PrimaryKey VARCHAR(100),    --主键,可以为空,但@Order为空时该值不能为空
@Fields    VARCHAR(200),        --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize INT,            --每页记录数
@CurrentPage INT,        --当前页,0表示第1页
@Filter VARCHAR(200) = '',    --条件,可以为空,不用填 where
@Group VARCHAR(200) = '',    --分组依据,可以为空,不用填 group by
@Order VARCHAR(200) = ''    --排序,可以为空,为空默认按主键升序排列,不用填 order by
AS
BEGINDECLARE @SortColumn VARCHAR(200)DECLARE @Operator CHAR(2)DECLARE @SortTable VARCHAR(200)DECLARE @SortName VARCHAR(200)IF @Fields = ''SET @Fields = '*'IF @Filter = ''SET @Filter = 'WHERE 1=1'ELSESET @Filter = 'WHERE ' +  @FilterIF @Group <>''SET @Group = 'GROUP BY ' + @GroupIF @Order <> ''BEGINDECLARE @pos1 INT, @pos2 INTSET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')IF CHARINDEX(' DESC', @Order) > 0IF CHARINDEX(' ASC', @Order) > 0BEGINIF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)SET @Operator = '<='ELSESET @Operator = '>='ENDELSESET @Operator = '<='ELSESET @Operator = '>='SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')SET @pos1 = CHARINDEX(',', @SortColumn)IF @pos1 > 0SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)SET @pos2 = CHARINDEX('.', @SortColumn)IF @pos2 > 0BEGINSET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)IF @pos1 > 0 SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)ELSESET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)ENDELSEBEGINSET @SortTable = @TableNamesSET @SortName = @SortColumnENDENDELSEBEGINSET @SortColumn = @PrimaryKeySET @SortTable = @TableNamesSET @SortName = @SortColumnSET @Order = @SortColumnSET @Operator = '>='ENDDECLARE @type varchar(50)DECLARE @prec intSELECT @type=t.name, @prec=c.precFROM sysobjects o JOIN syscolumns c on o.id=c.idJOIN systypes t on c.xusertype=t.xusertypeWHERE o.name = @SortTable AND c.name = @SortNameIF CHARINDEX('char', @type) > 0SET @type = @type + '(' + CAST(@prec AS varchar) + ')'DECLARE @TopRows INTSET @TopRows = @PageSize * @CurrentPage + 1print @TopRowsprint @OperatorEXEC('
        DECLARE @SortColumnBegin ' + @type + 'SET ROWCOUNT ' + @TopRows + 'SELECT @SortColumnBegin=' + @SortColumn + ' FROM  ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + 'SET ROWCOUNT ' + @PageSize + 'SELECT ' + @Fields + ' FROM  ' + @TableNames + ' ' + @Filter  + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '    ')
ENDGO

方法二:

/*********************************************************
* 作    用:数据分页
* 作    者:Ozawa
* 作者博客:https://www.cnblogs.com/xiongze520/
* 创建日期:2019-05-13
* 使用说明:
      declare @pageCount int exec commonPagination  'job_id,job_desc','jobs','job_id', 'asc','1=1',2,2,@pageCount output --select '总页数为:' + str(@pageCount)
*********************************************************/
CREATE  PROCEDURE commonPagination
@columns varchar(500), --要显示的列名,用逗号隔开
@tableName varchar(100), --要查询的表名
@orderColumnName varchar(100), --排序的列名
@order varchar(50), --排序的方式,升序为asc,降序为 desc
@where varchar(100), --where 条件,如果不带查询条件,请用 1=1
@pageIndex int, --当前页索引
@pageSize int, --页大小(每页显示的记录条数)
@pageCount int  --总页数,输出参数
as
begin declare @sqlRecordCount nvarchar(1000) --得到总记录条数的语句 declare @sqlSelect nvarchar(1000) --查询语句 set @sqlRecordCount=N'select @recordCount=count(*) from ' +@tableName + ' where '+ @where declare @recordCount int --保存总记录条数的变量 exec sp_executesql @sqlRecordCount,N'@recordCount int output',@recordCount output --动态 sql 传参 if( @recordCount % @pageSize = 0) --如果总记录条数可以被页大小整除 set @pageCount = @recordCount / @pageSize --总页数就等于总记录条数除以页大小 else --如果总记录条数不能被页大小整除 set @pageCount = @recordCount / @pageSize + 1 --总页数就等于总记录条数除以页大小加1 set @sqlSelect = N'select '+@columns+' from ( select row_number() over (order by ' +@orderColumnName+' '+@order +') as tempid,* from ' +@tableName+' where '+ @where +') as tempTableName where tempid between ' +str((@pageIndex - 1)*@pageSize + 1 ) +' and '+str( @pageIndex * @pageSize) exec (@sqlSelect) --执行动态Sql
end 

方法三:

create PROCEDURE commonPagination
(@TableName   VARCHAR(2000),         --表名@ReFieldsStr VARCHAR(1000) = '*',     --字段名(全部字段为*)@OrderString VARCHAR(200),         --排序字段(必须!支持多字段不用加order by)@WhereString VARCHAR(500) = N'',     --条件语句(不用加where)@PageSize    INT,                     --每页多少条记录@PageIndex   INT          = 1,     --指定当前为第几页@TotalRecord INT OUTPUT            --返回总记录数
)
ASBEGIN    --处理开始点和结束点DECLARE @StartRecord INT;DECLARE @EndRecord INT;DECLARE @TotalCountSql NVARCHAR(500);DECLARE @SqlString NVARCHAR(2000);SET @StartRecord = (@PageIndex - 1) * @PageSize + 1;SET @EndRecord = @StartRecord + @PageSize - 1;SET @TotalCountSql = N'select @TotalRecord = count(*) from '+@TableName;--总记录数语句SET @SqlString = N'(select row_number() over (order by '+@OrderString+') as rowId,'+@ReFieldsStr+' from '+@TableName;--查询语句-- 判断条件是否为空IF(@WhereString != ''OR @WhereString != NULL)BEGINSET @TotalCountSql = @TotalCountSql+'  where '+@WhereString;SET @SqlString = @SqlString+'  where '+@WhereString;END;--返回总记录数EXEC sp_executesql@totalCountSql,N'@TotalRecord int out',@TotalRecord OUTPUT;----执行主语句SET @SqlString = 'select * from '+@SqlString+') as t where rowId between '+LTRIM(STR(@StartRecord))+' and '+LTRIM(STR(@EndRecord));EXEC (@SqlString);END;

方式四:

/*********************************************************
* 作    用:数据分页
* 作    者:Ozawa
* 作者博客:https://www.cnblogs.com/xiongze520/
* 创建日期:2019-05-13
* 使用说明:
      [USP_GetPageData] 'select * from 表名',1,10
*********************************************************/
CREATE PROCEDURE [dbo].[USP_GetPageData]
(                         @SQLSTR VARCHAR(8000)    -- 查询的SQL语句 , @CURPAGE INT          -- 当前页面位置, @PAGESIZE INT            -- 页面显示的数据行数
)
AS
BEGINSET NOCOUNT ONDECLARE     @P1 INT   --游标, @ROWCOUNT INT, @COUNTPAGE INT, @CurRow INTEXEC sp_cursoropen @P1 OUTPUT, @SQLSTR, @scrollopt = 1, @ccopt = 1, @ROWCOUNT = @ROWCOUNT OUTPUTIF @ROWCOUNT % @PAGESIZE > 0SET @COUNTPAGE = @ROWCOUNT / @PAGESIZE + 1ELSESET @COUNTPAGE = @ROWCOUNT / @PAGESIZEIF @CURPAGE > @COUNTPAGESET @CURPAGE = @COUNTPAGESET @CurRow = (@CURPAGE - 1) * @PAGESIZE + 1SET NOCOUNT OFFSELECT @CURPAGE CURPAEG, @PAGESIZE PageSize, @COUNTPAGE COUNTPAGE, @ROWCOUNT [ROWCOUNT]EXEC sp_cursorfetch @P1, 16, @CurRow, @PAGESIZESET NOCOUNT ONEXEC sp_cursorclose @P1
END

还有更多分页方式,感兴趣的可以去查查资料,上面的分页方式已经足够参考了,

然后结合自身情况可以写一个量身定做的分页方法,后续直接使用就可以了。

转载于:https://www.cnblogs.com/xiongze520/p/10855312.html

【干货】SqlServer 总结几种存储过程分页的使用相关推荐

  1. (转)几种常用存储过程分页方法

    我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据 几种常用存储过程分页方法 TopN方法 select Top(@PageSize) from TableNam ...

  2. silverlight + wcf(json格式) + sqlserver存储过程分页

    silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1.0版本的,silverlight2.0 ...

  3. MS SQLSERVER通用存储过程分页

    最近在面试的时候,遇到个奇葩的秃顶老头面试官. 问:写过存储过程分页吗? 答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过. 问:那你这么多年工作中就没写过吗? 答:的确没写过, ...

  4. SQL存储过程分页(通用的拼接SQL语句思路实现)

    多表通用的SQL存储过程分页 案例一: USE [Community] GO/****** Object: StoredProcedure [dbo].[Common_PageList] Script ...

  5. 超经典的存储过程分页 ;-) 引自CSDN网友所作

    主 题: 好东西分享哟!! 利用SqlServer内部存储过程实现快速方便的分页 作 者: zxbyhcsdn (沙子)        Blog 等 级: 信 誉 值: 97 所属社区: MS-SQL ...

  6. (转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现

    原文:http://www.cnblogs.com/herbert/archive/2010/07/26/1785445.html 参考了许多的资料和不断地调试,总算把这个问题弄清楚了.实现了一个简单 ...

  7. 8种MySQL分页方法总结

    今天在做数据库练习的时候由于数据有点多,一下全部显示出来不好看,看着比较乱,所以在查了一下怎么让MySQL分页找到了一篇不错的文章,在这里分享给大家.如果有帮到大家麻烦点个赞.谢谢. 方法1: 直接使 ...

  8. 关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现

    程序有3个控件 BindingNavigator: 就是DataGridView控件上面的那个,在工程里名字: bindngrDemo DataGridView: dgvDemo BindingSou ...

  9. [百万级]通用存储过程.分页存储过程

    /*  名称:spAll_ReturnRows  输入:  输出:  调用:   EXEC spAll_ReturnRows 'SELECT  * FROM 表名', 页号, 返回记录数, '主键', ...

最新文章

  1. 一、multiprocessing.pool.RemoteTraceback
  2. 终结谷歌AutoML的真正杀手!Saleforce开源TransmogrifAI
  3. UA MATH523A 实分析3 积分理论例题 集合的特征函数L2收敛的条件
  4. python 列表 随机采样_Python 随机抽样
  5. 《Docker——容器与容器云》:第一章 从容器到容器云
  6. 你认为任正非与柳传志那个更值得钦佩?
  7. 物联网卡为什么会这么火,主要有哪些优势?
  8. python之路_前端基础之jQuery入门2
  9. c语言编程获取摄像头图像,OpenCV 获取摄像头图像数据并显示
  10. 基于python sklearn的 RandomForest随机森林 类实现
  11. 软件测试必须知道的缺陷分析
  12. RADIUS协议基础原理
  13. Spark Sql编程
  14. 用python刷网页浏览量_Python 刷网页访问量
  15. 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
  16. 一辈子不用考试?你可能是个假程序员
  17. ubuntu服务器ftp无法上传文件,ubuntu服务器上传文件ftp
  18. 安装VMware虚拟机后,网络适配器找不到VMnet8和VMnet1解决方法。
  19. 汇编指令及其英文全称
  20. 使用加密锁加密Unity工程插件源码

热门文章

  1. 【leetcode 968. 监控二叉树】解题报告
  2. Solr字段类型field type的定义
  3. C#中抽象类和接口的区别与使用
  4. sqlserver怎么将excel表的数据导入到数据库中
  5. linux usb驱动框架
  6. SQLite简易入门
  7. Vitamio打造自己的Android万能播放器
  8. Silverlight入门系列]使用MVVM模式
  9. springmvc静态资源;mvc:default-servlet-handler后Controller失效
  10. 19-spring学习-springMVC环境配置