实现分页查询的一种方法,使用Microsoft SQL Server数据库

news/2024/4/27 17:59:01/文章来源:https://blog.csdn.net/qq_40071585/article/details/136992191

实现分页查询的一种方法,使用Microsoft SQL Server数据库

  • 一、SQL语言用于分页的语句
  • 二、后端过程设计示例
  • 三、前端实现逻辑
  • 总结

各数据库均提供了分页查询的语句和相应的方法,但是如果查询的结果较为复杂,如查询结果需要结过再计算、分段、添加汇总行等操作后再输出,就需要考虑的更为全面一些,而且还要配合前端实现的逻辑。本文是在实践中用到一种方法,仅供参考。

一、SQL语言用于分页的语句

在最新版本的Microsoft SQL Server中,分页查询通常是通过使用OFFSETFETCH NEXT子句来实现的。这种方法是在SQL Server 2012及以后的版本中引入的,它提供了一种更直观和高效的方式来进行分页。
以下是一个使用OFFSETFETCH NEXT进行分页查询的基本示例:

SELECT *
FROM YourTable
ORDER BY SomeColumn
OFFSET (@pageIndex - 1) * @pageSize ROWS
FETCH NEXT @pageSize ROWS ONLY;

在这个例子中:

  • @pageIndex 表示当前页码,它是一个变量,代表用户请求的页码。
  • @pageSize 表示每页显示的记录数,它也是一个变量。
  • OFFSET 用于跳过指定数量的行,计算方式是(当前页码 - 1) * 每页记录数
  • FETCH NEXT 用于限制结果集只返回接下来的指定数量的行,即每页的记录数。
    这种方法的优点是它简单、直观,并且性能良好,特别是在处理大量数据时。它避免了在旧版本中常用的一些复杂方法,如使用ROW_NUMBER()函数或者多次查询来确定行的偏移量。
    请注意,为了使用这种方法,你需要确保你的SQL Server版本至少是2012或更高版本。如果你使用的是更早的版本,你可能需要使用其他方法,如ROW_NUMBER()或者CURSOR等。

二、后端过程设计示例

USE [hyX1201]
GO
/****** Object:  StoredProcedure [dbo].[X9_ZZCH_MXZZ]    Script Date: 2024-03-21 15:39:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ==================================================================================
-- Author:		昆山华岳软件有限公司 岳国军
-- Script Date: 2023-11-30
-- Description:	总账查询:存货总账_明细总账 分页查询示例程序,本例不使用存储表
-- ===================================================================================
ALTER PROCEDURE [dbo].[X9_ZZCH_MXZZ](@KSNY CHAR(6),@JSNY CHAR(6),@CKMC NVARCHAR(50),@CXYC INT,@CXHS INT,@RQSJ VARCHAR(30))--查询页次:-1 获取总行数,>=0 查询的页次,--查询行数:每页查询行数,--日期时间:可用于命名临时表,由前端生成
ASDECLARE	@LJZD VARCHAR(100);SET @LJZD ='存货明细账查询';IF @CXYC=-2RETURN;IF @CXYC=-1BEGIN--返回结果行数WITH MXZZ (CHXH,CHDH,CHMC,XH1,XH2,XH3,GG1,JLDW,QCSL,QCJS,QCJE,SRSL,SRJS,SRJE,FCSL,FCJS,FCJE,JCSL,JCJS,JCJE) AS (SELECT XM.CHXH, XM.CHDH, XM.CHMC, XM.XH1, XM.XH2, XM.XH3, XM.GG1, XM.JLDW,SUM(CASE ZZ.NY WHEN @KSNY THEN ZZ.QCSL ELSE 0 END) AS QCSL, SUM(CASE ZZ.NY WHEN @KSNY THEN ZZ.QCJS ELSE 0 END) AS QCJS, SUM(CASE ZZ.NY WHEN @KSNY THEN ZZ.QCJE ELSE 0 END) AS QCJE, SUM(ZZ.SRSL) AS SRSL, SUM(ZZ.SRJS) AS SRJS, SUM(ZZ.SRJE) AS SRJE, SUM(ZZ.FCSL) AS FCSL, SUM(ZZ.FCJS) AS FCJS, SUM(ZZ.FCJE) AS FCJE, SUM(CASE ZZ.NY WHEN @JSNY THEN ZZ.JCSL ELSE 0 END) AS JCSL, SUM(CASE ZZ.NY WHEN @JSNY THEN ZZ.JCJS ELSE 0 END) AS JCJS, SUM(CASE ZZ.NY WHEN @JSNY THEN ZZ.JCJE ELSE 0 END) AS JCJEFROM UTZZCH AS ZZ INNER JOIN MLCHXM AS XM ON ZZ.CHXH = XM.CHXHWHERE (ZZ.CKMC=@CKMC OR @CKMC='') AND (ZZ.NY BETWEEN @KSNY AND @JSNY)GROUP BY XM.CHXH, XM.CHDH, XM.CHMC, XM.XH1, XM.XH2, XM.XH3, XM.GG1, XM.JLDW)SELECT COUNT(*) AS CXHS FROM MXZZ ;	ENDIF @CXYC>-1BEGIN--返回当前页所需要查询结果 WITH MXZZ (CHXH,CHDH,CHMC,XH1,XH2,XH3,GG1,JLDW,QCSL,QCJS,QCJE,SRSL,SRJS,SRJE,FCSL,FCJS,FCJE,JCSL,JCJS,JCJE) AS (SELECT XM.CHXH, XM.CHDH, XM.CHMC, XM.XH1, XM.XH2, XM.XH3, XM.GG1, XM.JLDW,SUM(CASE ZZ.NY WHEN @KSNY THEN ZZ.QCSL ELSE 0 END) AS QCSL, SUM(CASE ZZ.NY WHEN @KSNY THEN ZZ.QCJS ELSE 0 END) AS QCJS, SUM(CASE ZZ.NY WHEN @KSNY THEN ZZ.QCJE ELSE 0 END) AS QCJE, SUM(ZZ.SRSL) AS SRSL, SUM(ZZ.SRJS) AS SRJS, SUM(ZZ.SRJE) AS SRJE, SUM(ZZ.FCSL) AS FCSL, SUM(ZZ.FCJS) AS FCJS, SUM(ZZ.FCJE) AS FCJE, SUM(CASE ZZ.NY WHEN @JSNY THEN ZZ.JCSL ELSE 0 END) AS JCSL, SUM(CASE ZZ.NY WHEN @JSNY THEN ZZ.JCJS ELSE 0 END) AS JCJS, SUM(CASE ZZ.NY WHEN @JSNY THEN ZZ.JCJE ELSE 0 END) AS JCJEFROM UTZZCH AS ZZ INNER JOIN MLCHXM AS XM ON ZZ.CHXH = XM.CHXHWHERE (ZZ.CKMC=@CKMC OR @CKMC='') AND (ZZ.NY BETWEEN @KSNY AND @JSNY)GROUP BY XM.CHXH, XM.CHDH, XM.CHMC, XM.XH1, XM.XH2, XM.XH3, XM.GG1, XM.JLDW)SELECT CHXH,CHDH,CHMC,XH1,XH2,XH3,GG1,JLDW,QCSL,QCJS,CASE WHEN QCSL<>0 THEN QCJE/QCSL ELSE 0 END AS QCDJ,QCJE,SRSL,SRJS,SRJE,FCSL,FCJS,FCJE,JCSL,CASE WHEN JCSL>0 THEN JCJE/JCSL ELSE 0 END AS JCDJ,JCJS,JCJE,@LJZD AS 链接功能 FROM MXZZORDER BY CHDH,CHXH  offset (@CXYC*@CXHS)  rows fetch next @CXHS rows only;	RETURN;END
RETURN;

三、前端实现逻辑

  '由前端定义每次查询的行数Public pCXHS As Integer = 25		'查询行数,不再存储本地文件Dim DqPage As Integer = 0			'当前页Dim EndPage As Integer = 0		'最后一页Dim CXrqsj As String = ...		'定义一时间戳Dim CXsql As String = ""dim Dt1 as DataTabledim Sql1 as String 				'原来的查询语句。	...... sql1根据前端定义赋值EndPage = -1If InStr(UCase(Sql1), "<CXYC>") > 0 And InStr(UCase(Sql1), "<CXHS>") > 0 ThenDim CRsql As String = Replace(CXsql, "<CXYC>", "-1")CRsql = Replace(CRsql, "<CXHS>", pCXHS)CRsql = Replace(CRsql, "<RQSJ>", CXrqsj)'初次查询时获取总行数Dim cxrows As Integer = GetDBInteger(CRsql)If cxrows <= 0 ThenExit SubEnd If'计算出最大页号EndPage = cxrows \ pCXHSIf (cxrows Mod pCXHS) = 0 ThenEndPage -= 1End IfL3.Caption = "共[" & cxrows.ToString.Trim & "]行记录,分" & (EndPage + 1).ToString.Trim & "页查询"ElseL3.Caption = ""End If......根据前端查询状态确定当前页次后查询相应页次的数据Dt1 = New DataTableDim Sql1 As StringSql1 = Replace(CXsql, "<CXYC>", DqPage)Sql1 = Replace(Sql1, "<CXHS>", pCXHS)Sql1 = Replace(Sql1, "<RQSJ>", CXrqsj)Dt1 = GetDTread(Sql1)If IsNothing(Dt1) ThenXXshow("数据未能正确载入", Me)Exit SubEnd IfGridCX.DataSource = NothingGridCX.DataSource = Dt1Gdgv.RefreshData()'更新翻页按钮状态Btpg1.Enabled = (DqPage > 0) And (EndPage > 0)Btpg2.Enabled = (DqPage > 0) And (EndPage > 0)Btpg3.Enabled = (DqPage < EndPage) And (EndPage > 0)Btpg4.Enabled = (DqPage < EndPage) And (EndPage > 0)Lczs.Text = " 第 " & (DqPage + 1).ToString.Trim & " 页 共 " & (EndPage + 1).ToString.Trim & " 页 "...... 

总结

如果查询结果行数非常多或需要的计算较为复杂,应在初次查询使用(返回行数)时,将查询结果存在临时表中,后面查询就可以从此查询了。总之,不管什么方法,都是需要前端合理配合,才能收到更好的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026646.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发展规划--IM系统

1、时代背景 5G应用&#xff0c;多终端应用&#xff0c;物联网应用&#xff0c;小程序&#xff0c;工业互联&#xff0c;大数据应用等等大前端时代的到来&#xff0c;程序员不能只关注crud&#xff0c;因为以后的服务并发量只会越来越多。 高并发架构师、大数据架构师或者说j…

【Git篇】复习git

文章目录 &#x1f354;什么是git⭐git和svn的区别 &#x1f354;搭建本地仓库&#x1f354;克隆远程仓库&#x1f6f8;git常用命令 &#x1f354;什么是git Git是一种分布式版本控制系统&#xff0c;它可以追踪文件的变化、协调多人在同一个项目上的工作、恢复文件的旧版本等…

椋鸟数据结构笔记#2:复杂度

萌新的学习笔记&#xff0c;写错了恳请斧正。 目录 复杂度 时间复杂度 空间复杂度 通过复杂度衡量算法好坏 复杂度 复杂度是衡量算法好坏的一种方式。一般分为时间复杂度和空间复杂度&#xff0c;分别用于衡量一个算法在运行时间长短和占据内存空间多少两方面的优劣。 一…

elasticsearch 6.8.x 索引别名、动态索引扩展、滚动索引

文章目录 引言索引别名&#xff08;alias&#xff09;创建索引别名查询索引别名删除索引别名重命名索引别名 动态索引&#xff08;index template&#xff0c;动态匹配生成索引&#xff09;新建索引模板新建索引并插入数据索引sys-log-202402索引sys-log-202403索引sys-log-202…

C语言例4-3:复合语句,输出a,b的值

代码如下&#xff1a; //复合语句&#xff0c;输出a,b的值 #include<stdio.h> int main(void) {int a 10;printf("a %d\n",a);{int b20; //复合语句printf("b %d\n",b); //复合语句中的数据定义语句放在其他语句的前面}return …

uniapp实现单选组件覆盖选中样式

uniapp实现单选组件覆盖选中样式 完整代码&#xff1a; <!-- 是否选择组件: trueOfFalseChooseBtn --> <template><view class"is-true-body"><view class"btn-con" :class"isTrue ? btn-con-active : " click"clic…

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…

前端Web移动端学习day05

移动 Web 第五天 响应式布局方案 媒体查询Bootstrap框架 响应式网页指的是一套代码适配多端&#xff0c;一套代码适配各种大小的屏幕。 共有两种方案可以实现响应式网页&#xff0c;一种是媒体查询&#xff0c;另一种是使用bootstrap框架。 01-媒体查询 基本写法 max-wid…

如何优化财务管理?中小型外贸企业实用指南

在当今全球化的商业环境中&#xff0c;越来越多的中小企业涉足外贸领域&#xff0c;以寻求更广阔的市场和发展空间。在这一过程中&#xff0c;财务管理的重要性尤为凸显&#xff0c;需关注外汇风险、税务合规性、现金流等多个方面的问题。 一、中小企业外贸财务管理难题 币种核…

Python入门练习 - 学生管理系统

Python 实现读书管理系统 """ 实现一个命令行版的读书管理系统 """ import os.path import sys# 使用这个全局变量&#xff0c;来管理所有的学生信息 # 这个列表的每个元素都是一个‘字典’&#xff0c;每 个 字典就分别表示了一个同学students …

argocd cli工具使用

一、前言 ragocd除了使用web界面操作之外&#xff0c;也可以通过argocd cli工具进行操作&#xff0c;关于集群创建、gitlab仓库创建、app创建都是可以通过yaml 文件去操作&#xff0c;使用web界面创建的操作也需要使用argocd cli工具进行备份 二、使用 在argocd部署的章节已经…

阿里云4核16G服务器优惠价格26元1个月、149元半年

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年。2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询&#xff08;子查询&#xff09;同表不同表嵌套查询还能用于删除…

Python基础教程:基本数据类型

基本数据类型 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组) 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合) Numbers(数字) 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对…

【正点原子FreeRTOS学习笔记】————(12)信号量

这里写目录标题 一、信号量的简介&#xff08;了解&#xff09;二、二值信号量&#xff08;熟悉&#xff09;三、二值信号量实验&#xff08;掌握&#xff09;四、计数型信号量&#xff08;熟悉&#xff09;五、计数型信号量实验&#xff08;掌握&#xff09;六、优先级翻转简介…

腾讯云GPU云服务器_GPU云计算_异构计算_弹性计算

腾讯云GPU服务器是提供GPU算力的弹性计算服务&#xff0c;腾讯云GPU服务器具有超强的并行计算能力&#xff0c;可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景&#xff0c;腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年&#xff0c;其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年&#xff0c;LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今&#xff0c;LinkedIn 在全球运营&#xff0c;拥有超过 3.5 亿会…

R使用netmeta程序包实现生存数据的频率学网状meta分析

之前的推文系统的介绍了使用netmeta包实现对二分类变量、连续型变量和罕见事件的网状meta分析。今天的文章介绍如何使用netmeta程序包实现生存数据的频率学网状meta分析&#xff0c;用来评估6种免疫疗法&#xff08; Camrelizumab、Tislelzumab、Toripalimab、Sintilimab、Pemb…

(二)windows配置JDK环境

1、安装包下载地址&#xff0c;官网&#xff1a;Java Archive | Oracle 长期稳定支持版本8、11、17、21 选择一个需要下载的连接点进去&#xff1a; 在下载列表中根据操作系统选择不同的下载包&#xff1a; 注意&#xff1a;部分版本下载需要先登录后才可以下载。 安装包附件…

Canal解决Redis缓存与Mysql数据库的一致性问题

1、什么是Canal&#xff1f; 如何解决Redis缓存与Mysql数据库的一致性问题&#xff1f;我们常用数据双删缓存超时设置去解决。这样最差的情况&#xff0c;就是在超时时间内&#xff0c;数据存在不一致。 canal&#xff0c;译为管道&#xff0c;主要用途是基于 MySQL 数据库增…