分页系列之一:SQL Server 分页存储过程
2024-09-08 01:28:17
以下为最基本的代码结构,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,这里就不列举了。
最新文章
- PHP 做文件校验,MD5,CRC32,SHA等
- Cenots7编译Opencv3.1错误:下载ippicv,解决方案
- app快速开发
- Ubuntu配置java环境变量
- Javascript 笔记与总结(2-1)Javascript 与 DOM
- MVC ViewData和ViewBag[转]
- Warning: Invalid argument supplied for foreach()
- 文字排版--删除线(text-decoration:line-through)
- C#解leetcode 189. Rotate Array
- php 通过ip获取地理位置
- 简单实用后台任务执行框架(Struts2+Spring+AJAX前端web界面可以获取进度)
- Gradle 载入中 Android 下一个.so档
- SG函数学(hua)习(shui)记录
- 在CentOS6.9 x86下编译libusb-1.0.22遇到的两个问题
- CMS GC启动参数优化配置
- 让Hibernate和触发器协同工作
- std::bind常见的坑
- Rails中实现批量删除
- JDB调试代码 20165324 何春江
- DevStore分享:详析消费者十大心理学
热门文章
- SpringCloud(四):服务注册中心Eureka Eureka高可用集群搭建 Eureka自我保护机制
- 2021-2-28:调用 System.gc() 后究竟发生了什么?
- 微信小程序使用彩色图标(阿里巴巴 iconfont Symbol 的用法)微信小程序使用彩色图标(阿里巴巴 iconfont Symbol 的用法)
- MySql 基础使用(一)
- golang——win10环境protobuf的使用
- NumPy 将停止支持 Python 2
- 如何优雅的移植JavaScript组件到Blazor
- 【codeforces - 1307G】Cow and Exercise
- springboot 配置文件application
- Linux wget 使用笔记