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

实现分页查询的一种方法,使用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.mzph.cn/news/768141.shtml

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

相关文章

Zookeeper(八)序列化与协议

目录 一 序列化与反序列化1.1 Jute序列化工具1.1 Recor接口1.2 OutputArchive和InputArchive 二 通信协议2.1 请求部分2.1.1 请求头2.2.2 请求体2.1.3 案例分析 2.2 响应部分2.2.1 响应头2.2.2 响应内容2.2.3 案例分析 官网&#xff1a;Apache ZooKeeper 一 序列化与反序列化 …

Spark RDD 基本操作

Spark RDD 基本操作 在前面已经介绍过Spark RDD的两种操作分别是&#xff1a; Transformation&#xff08;转换操作&#xff09; Action&#xff08;行动操作&#xff09; 下面以例子的方式详细介绍Spark RDD的这两种操作涉及的函数。 Transformation&#xff08;转换操作&…

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

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

信号处理--使用EEGNet进行BCI脑电信号的分类

目录 理论 工具 方法实现 代码获取 理论 EEGNet作为一个比较成熟的框架&#xff0c;在BCI众多任务中&#xff0c;表现出不俗的性能。EEGNet 的主要特点包括&#xff1a;1&#xff09;框架相对比较简单紧凑 2&#xff09;适合许多的BCI脑电分析任务 3&#xff09;使用两种卷…

关闭 Microsoft Word 2010 配置窗口

关闭 Microsoft Word 2010 配置窗口 References 出现这种问题&#xff0c;主要是安装时所用账户和目前登陆的账户不为同一个账户造成的。或者你进行过覆盖安装或是重新安装过系统&#xff0c;但是 office 的安装目录没有更改。先激活 Microsoft Office&#xff0c;然后执行下列…

Unity Canvas的三种模式

一、简介&#xff1a; Canvas的Render Mode一共有三种模式&#xff1a;Screen Space -OverLay、Screen Space-Camera、World Space Screen Space - Overlay&#xff08;屏幕空间 - 覆盖&#xff09;&#xff1a; 这是最简单的 Canvas 渲染模式。UI 元素在这个模式下将渲染在屏…

web CSS笔记1

CSS(Cascading Style Sheets) 美化样式 CSS通常称为CSS样式表或层叠样式表&#xff08;级联样式表&#xff09;&#xff0c;主要用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距等&#xff09;以及…

栅格地图路径规划:基于霸王龙优化算法(Tyrannosaurus optimization,TROA)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

【云开发笔记No.7】敏捷开发

敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它起源于20世纪90年代初期&#xff0c;由一些软件行业的先驱者提出&#xff0c;旨在解决传统软件开发过程中存在的一些问题&#xff0c;如需求变化频繁、开发周期长、成本高等。敏捷开发强调团队合作、客户需求和快速…

那些王道书里的题目-----计算机网络篇

注&#xff1a;仅记录个人认为有启发的题目 p155 34.下列四个地址块中&#xff0c;与地址块 172.16.166.192/26 不重叠&#xff0c;且与172.16.166.192/26聚合后的地址块不会引入多余地址的是&#xff08;&#xff09; A.172.16.166.192/27 B.172.16.166.128/26 …

目标检测中的mAP计算原理和源码实现

简介 在目标检测任务中&#xff0c;mAP&#xff08;mean Average Precision&#xff0c;平均精度均值&#xff09;是一个非常重要的评价指标&#xff0c;用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率&#xff0c;能够全面反映模型在检测任务中…

Matlab|【免费】智能配电网的双时间尺度随机优化调度

目录 1 主要内容 基础模型 2 部分代码 3 部分程序结果 4 下载链接 1 主要内容 该程序为文章《Two-Timescale Stochastic Dispatch of Smart Distribution Grids》的源代码&#xff0c;主要做的是主动配电网的双时间尺度随机优化调度&#xff0c;该模型考虑配电网的高效和安…

计算机网络——25Internet-Protocol

Internet Protocol 互联网中的网络层 主机、路由器中的网络层功能 IP数据报格式 项目说明ver版本号&#xff0c;如Ipv4就是0100head len头部的长度&#xff0c;一般头部是20个字节(也就是上图中的5行)&#xff0c;但是也有可选项&#xff0c;也就是头部是变长的&#xff0c;因…

【C语言】指针基础知识(二)

一&#xff0c;指针变量类型的意义 1&#xff0c;指针的类型决定了&#xff0c;对指针解引⽤的时候有多⼤的权限&#xff08;⼀次能操作⼏个字节&#xff09;。 例如&#xff1a;char* 的指针解引⽤访问⼀个字节&#xff0c;int* 的指针解引⽤访问四个字节&#xff0c;short*…

[SAP MM] 名词专业术语解释

采购凭证 采购凭证通常是一种证明文件&#xff0c;用于记录和跟踪特定时间点的采购活动 采购凭证是指企业在采购物品或服务时所开立的一种凭证&#xff0c;用于记录采购的信息和流程 采购凭证通常包括采购申请、采购订单、采购合同等&#xff0c;其中采购订单是最常用的采购…

C语言UNIX域套接字CS模型

实验目标: 1 实现基于流的unix域套接字通信cs模型 2 实现基于数据报的unix域套接字通信cs模型 3 可以观察到CS两端的完整启动退出流程,为了实现这一目标仅进行一次通信 实验心得: 1 使用unlink避免地址冲突 清理资源 2 传统udp在首次sendto时系统临时分配端口,在套接字关…

周末分享一篇关于html和http的文章吧

前面咱们说了https://blog.csdn.net/luohaitao/article/details/136974344&#xff08;说道说道JSP和HTTP吧-CSDN博客&#xff09;&#xff0c;把http的方法和jsp中httpservle对象的方法对上号了&#xff0c;其实从开发的角度看&#xff0c;jsp就是html中混入了java的服务端代码…

Rust并发编程thread多线程和channel消息传递

安全高效的处理并发是 Rust 诞生的目的之一&#xff0c;主要解决的是服务器高负载承受能力。 并发&#xff08;concurrent&#xff09;的概念是指程序不同的部分独立执行&#xff0c;这与并行&#xff08;parallel&#xff09;的概念容易混淆&#xff0c;并行强调的是"同…

DNS、DNS劫持与HTTPDNS:原理、应用与安全分析

文章目录 一、DNS原理和应用1.1 原理1.2 应用 二、DNS劫持的场景和原因分析2.1 场景2.2 原因分析 三、HTTPDNS的应用场景3.1 应用场景3.2 HTTPDNS服务商 四、总结 一、DNS原理和应用 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的一项核心服务…

人工智能之Tensorflow批标准化

批标准化&#xff08;Batch Normalization,BN&#xff09;是为了克服神经网络层数加深导致难以训练而诞生的。 随着神经网络的深度加深&#xff0c;训练会越来越困难&#xff0c;收敛速度会很慢&#xff0c;常常会导致梯度消失问题。梯度消失问题是在神经网络中&#xff0c;当前…