以下为最基本的代码结构,SQL Server 2012 开始支持

CREATE PROCEDURE procXXX
@Page int, --当前页码,从1开始
@PageSize int --每页记录数
AS
BEGIN
SET NOCOUNT ON
SELECT *
FROM tbTest
ORDER BY ID
OFFSET @PageSize*(@Page-1) ROW FETCH NEXT @PageSize ROWS ONLY
--查询总记录数,前台分页需要
SELECT COUNT(*) FROM tbTest
END

实际使用时,可以采用拼接SQL的方式,因为两个查询语句的查询条件相同,这样只需要拼接一次查询条件,另外,如果需要动态排序,也需要拼接SQL,因为排序条件不接受SQL参数

CREATE PROCEDURE procXXX
@Page int, --页索引
@PageSize int, --每页记录数
@Number nvarchar(50) = '', --产品编号
@Status smallint = -1 --状态
AS
BEGIN
SET NOCOUNT ON
DECLARE @sql nvarchar(MAX), @condition nvarchar(MAX)
SET @condition = '1=1'
IF @Number <> ''
BEGIN
SET @condition += ' AND Number LIKE ''%' + @Number + '%'''
END
IF @Status <> -1
BEGIN
SET @condition += ' AND Status = ' + STR(@Status)
END
SET @sql='SELECT ID,Number
FROM tbProduct
WHERE '+@condition+'
ORDER BY ID DESC
OFFSET ' + STR(@PageSize*(@Page-1)) + ' ROW FETCH NEXT ' + STR(@PageSize) + ' ROWS ONLY
SELECT COUNT(*)
FROM tbProduct
WHERE '+@condition
EXECUTE(@sql)
END

以下为旧版的分页存储过程,支持早期SQL Server版本,必须使用拼接SQL的方式,因为TOP后面不接受参数。

create procedure procXXX
@Page int, --页索引
@PageSize int --每页记录数
as
begin
set nocount on;
declare @sql nvarchar(1000)
declare @condition nvarchar(500)
set @condition = '1=1'
set @sql='SELECT TOP '+str(@PageSize)+' *
FROM tbTest
WHERE '+@condition+'
AND (ID NOT IN(SELECT TOP '+str(@PageSize*(@Page-1))+' ID
FROM tbTest WHERE ID > 0 '+@condition+'
ORDER BY ID))
ORDER BY ID
SELECT COUNT(*) FROM tbTest WHERE '+@condition
execute(@sql)
end

还有其他分页方式,比如从 SQL Server 2005 开始,可以使用 ROW_NUMBER,这里就不列举了。

分页系列之一:SQL Server 分页存储过程的更多相关文章

  1. Oracle分页查询和SQL server分页查询总结

    分页查询是项目中必不可少的一部分,难倒是不难,就是这些东西,长时间不用,就忘的一干二净了.今天特此总结一下这两款数据库分页查询的实现过程(只记录效率比较高的) 一.Oracle中的分页查询 1.通用分 ...

  2. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  3. SQL server分页的四种方法

    SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路  先取前20页, ...

  4. SQL server分页的四种方法(算很全面了)

      这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...

  5. SQL SERVER 分页方法

    最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ...

  6. SQL Server分页模板

    SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...

  7. SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条

    SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条 SELECT Id,[Title],[Content],[Image] FROM ( SELECT ROW_NUMBER( ...

  8. 解决hibernate对Sql Server分页慢的问题

    一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...

  9. 二、SQL Server 分页

    一.SQL Server 分页 --top not in方式 select top 条数 * from tablename where Id not in (select top 条数*页数 Id f ...

  10. SQL Server分页查询进化史

    分页查询一直SQL Server的一个硬伤,就是是经过一些进化,比起MySql的limit还是有一些差距. 一.条件过滤(适应用所有版本) 条件过滤的方法有很多,而思路就是利用集合的差集选择出目标集合 ...

随机推荐

  1. 构建Docker私有仓库

    一.Docker私有仓库   上一篇说了如何利用Dockerfile在已有镜像的基础上构建自己的镜像,那么如果需要让镜像在一个团队中使用,就需要一个仓库,有几种方式可以共享私有镜像. 1.将镜像上传至 ...

  2. 鸿蒙开源第三方组件 ——B站开源弹幕库引擎的迁移(上)

    鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录: 一.弹幕库的基础知识 二.弹幕库的使用方法 三.sample解析 四.作者系列文章合集 前言 ...

  3. 小白养成记——JavaWeb之文件的上传

    文件的上传推荐使用commons的fileupload组件来完成.该组件还依赖于io包,因此需要用到两个jar包: commons-fileupload-X.X.jar commons-io-X.X. ...

  4. Java流程控制:循环结构

    一.简介 顺序结构的程序语句只能被执行一次,如果您想要同样的操作执行多次,就需要使用循环结构. Java中有三种主要的循环结构: 'while'循环 'do...while'循环 'for'循环 在J ...

  5. nginx+php-fpm docker镜像合二为一

    一.概述 在上一篇文章介绍了nginx+php-fpm,链接如下: https://www.cnblogs.com/xiao987334176/p/12918413.html nginx和php-fp ...

  6. iot漏洞入门

    路由器漏洞入门 下载项目https://github.com/praetorian-inc/DVRF 安装quem sudo apt install qemu-user-static 安装gdb-mu ...

  7. Excel老式技术

    Excel老式技术 VBS宏脚本嵌入明文代码

  8. 从零学脚手架(七)---webpack-dev-server使用

    如果此篇对您有所帮助,在此求一个star.项目地址: OrcasTeam/my-cli webpack-dev-server使用 什么是webpack-dev-server 使用vue-cli .re ...

  9. PTA 统计二叉树叶子结点个数

    6-2 统计二叉树叶子结点个数 (10 分)   本题要求实现一个函数,可统计二叉树的叶子结点个数. 函数接口定义: int LeafCount ( BiTree T); T是二叉树树根指针,函数Le ...

  10. 全面了解Vue3的 reactive 和相关函数

    Vue3的 reactive 怎么用,原理是什么,官网上和reactive相关的那些函数又都是做什么用处的?这里会一一解答. ES6的Proxy Proxy 是 ES6 提供的一个可以拦截对象基础操作 ...