SQL分页的存储过程详解

SQL Server 存储过程的分页方案比拼 SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点建立表:CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nva 阅读详情
ASP.Net中的DataGrid有内置分页功能,   但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页,   这种只选取了一小部分而丢掉大部分的方法是不可去取的.  
   
  在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现分页.   下面介绍一下我在项目中用到的分页方法.  
   
  当然显示控件还是用DataGrid的,   因为数据绑定很方便^_^.    
   
  要保证不传输冗余的数据,那么必须在数据库中数据读取时实现分页,   数据库的分页操作可以放在存储过程中.   看了优快云的一篇Blog中讲了一个百万级数据分页的存储过程的实现(http://blog.youkuaiyun.com/wellknow/posts/55167.aspx,他的这个方法可以根据不同情况进行适当的优化),   根据他的方法,这里实现一个简单的SQL语句来实现这里分页需要的存储过程。  
   
  create   procedure   ListProduct  
   
  (  
   
                @PageIndex   int,   --   分页后需要页的序号  
   
                @PageSize   int,   --   一页的大小  
   
                @ConditionSQL   –   查询条件的SQL语句  
   
  )  
   
    AS   …   具体代码就不写了(可以参考上面的链接).  
   
     
   
  具体的SQL语句如下:  
   
  SELECT   TOP   100   *   FROM   (select   *   from   product   where   productid<200000)   T   WHERE   T.productid   NOT   IN    
   
  (SELECT   TOP   900   productid   FROM   (select   productid   from   product   where   productid<200000)   T1   ORDER   BY   T1.productid   asc)   ORDER   BY   productid   asc    
   
  这条语句的   从总的商品(30万)中取出productid<200000(共20万),再按每页100的大小分页,然后取出第10页.  
   
     
   
  Public   DataTable   ListProduct(int   pageIndex,   int   pageSize)  
   
  {  
   
                //ADO.net从数据库中取出数据的代码就略过^_^.  
   
  }  
   
     
   
     
   
  用上面的存储过程读出的数据在DataGrid里面分页,   必须把DataGrid的AllowPaging和AllowCustomPaging设置为true  
   
  protected   System.Web.UI.WebControls.DataGrid   ProductGrid;  
   
  ProductGrid.AllowPaging   =   true;  
   
  ProductGrid.AllowCustomPaging   =   true;  
   
     
   
  然后在设置要显示的一页的大小  
   
  ProductGrid.PageSize   =   100;   //   在显示的时候依据实际的数据显示。  
   
  设置一页大小后,如果要让DataGrid实际分出页数来,还必须设置  
   
  ProductGrid.VirtualItemCount   =   GetProductCount()   ;   //   GetProductCount()   的功能是获取满足条件的产品数目,   这里的条件就是productid<200000.   设置这项属性后,那么这个DataGrid的页数就是  
   
  VirtualItemCount/PageSize,   也就是PageCount的值.   不能对PageCount直接赋值,因为他是只读的属性.  
   
  这些属性设置好后再绑定数据:  
   
  ProductGrid.DataSource   =   ListProduct(1,   ProductGrid.PageSize);   //   在Page_Load里面   pageIndex为1,记住判断IsPostBack,在IsPostBack为false时执行这些代码  
   
  ProductGrid.DataBind();  
   
     
   
  这样数据绑定后就可以看到具有分页模样的页面了.但是还不能真正的分页.要实现真正的分页,还必须实现下面的功能.  
   
     
   
  处理DataGrid的PageIndexChanged事件(处理用户新选中某页时的事件)  
   
  private   void   ProductGrid_PageIndexChanged(object   source,   System.Web.UI.WebControls.DataGridPageChangedEventArgs   e)  
   
  {  
   
            //   如果在存储过程分页功能中用1表示第一页的序号的话那么这里必须用e.NewPageIndex+1作为pageIndex(如果选择了DataGrid上页号为3的页,那么e.NewPageIndex就为2),   否则的话直接用e.NewPageIndex就可以了  
   
            ProductGrid.DataSource   =   ListProduct(e.NewPageIndex+1,   ProductGrid.PageSize);   //   从数据库中读取新的数据  
   
            ProductGrid.DataBind();  
   
            //   设置当前的Page序号值,   如果不设置的话它是不会变得,   这样会给用户造成误解,以为所有页的数据相同。  
   
            ProductGrid.CurrentPageIndex   =e.NewPageIndex;  
   
  }  
   
     
   
  如果你处理了DataGrid的ItemCommand的事件的话,必须在ItemCommand事件处理代码前面加上这些代码:  
   
  if   (e.Item.ItemType   ==   ListItemType.Pager)  
   
  {  
   
            return;  
   
  }  
   
  因为当PageIndexChanged事件激发,也就是用户选则了另外一页时会先激发ItemCommand事件,如果不这样处理的话,可能会遇到一些意想不到的情况(如果你确实需要的话也可以上面这段代码,不过最好实际测试一下)。  
   
     
   
  整个过程完成后,再次浏览页面,觉得速度真是快多了。  
SqlServer 多种分页方式 (含简单速度测试) SQLServer分页方式 附带50万数据分页时间[本机访问|已重启SQL服务|无其他程序干扰][非索引排序] 环境 WIN7 SQL服务12.04 SQL管理器SSMS14.01 1.Offset and Fetch 方式分页 [SqlServer2012+] OFFSET 起始值 ROWS FETCH NEXT 每页条数 ROWS ONLY 1.分页条件不能重复,建议使用 分页条件+主键 一起作为 分页参数 2.分页语句中 FIRST=NEXT ROWS=ROW 3.不使用排序可以用 order by (select 1) 使用 OFFSET FETCH 方式分页必须带order b 立即下载

相关推荐

FPGA时序约束:从时钟树到数据路径的深度解析与优化策略

本文深入解析FPGA时序约束的核心技术与优化策略,涵盖时钟树结构分析、时序报告解读和数据路径优化。重点探讨Vivado工具中的时序约束方法,包括时钟定义、异常约束和物理优化,帮助工程师掌握寄存器级时序分析和系统级协同设计,实现高性能FPGA设计。

u5v6w7的博客 653

SQL 分页查询存储过程

create PROC [dbo].[P_viewPage]-- Add the parameters for the stored procedure here@TableName VARCHAR(200), --表名@FieldList VARCHAR(2000), --显示列名,如果是全部字段则为*@PrimaryKey VARCHAR(100), --单一主键或唯一值键...

weixin_30872867的博客 136

AI视频生成成本优化实战:混合架构与硬件选型

AI视频生成技术正面临效果与成本的二元博弈,其核心挑战在于高昂的推理算力消耗与黑箱服务的不确定性。从技术原理看,视频生成依赖扩散模型等深度学习架构,通过多轮迭代实现像素级合成,这导致GPU显存占用和电力消耗呈指数级增长。在工程实践中,采用混合推理架构能有效平衡成本与质量,例如云端处理关键帧配合本地渲染过渡帧,实测可降低58%支出。硬件选型方面,消费级显卡魔改与边缘计算设备为中小企业提供了可行方案,如RTX 3090显存扩容或Jetson AGX边缘部署。当前AI视频应用已渗透电商直播、新闻制作等领域,但需警

weixin_29531177的博客 296

SQL Server下7种“数据分页”方案,全网最全

第三种,先把数据库中的相关数据全部读入“缓存”或第三方工具,再由代码程序对“缓存”或第三方工具中的数据进行读取+分页操作(速度快,简易性差)。这条语句的原理是先查询1-10条记录的ID,然后再查询ID不属于这1-10条记录的ID,并且只需要10条记录,因为每页大小就是10,第一种,把数据库中存放的相关数据,全部读入PHP/Java/C#代码/内存,再由代码对其进行分页操作(速度慢,简易性高)。第二种,直接在数据库中对相关数据进行分页操作,再把分页后的数据输出给代码程序(速度中,简易性中)。

风清扬的专栏 2946

STM32F4 SPI FLASH(W25Q128)驱动详解(含DMA+完整读写擦除+低功耗)

本文实现了一款基于STM32 HAL库的SPI Flash驱动,以W25Q128为例,提供了完整的初始化、读写、擦除、ID读取等功能。驱动集成了DMA传输、超时保护、页对齐写入等特性,支持扇区擦除、整片擦除、页写入及跨页缓冲写入。代码结构清晰,易于移植到其他SPI Flash型号(如W25Q64、W25Q16等),适用于数据存储、固件升级、文件系统等嵌入式场景。

kevin1499的博客 98

大模型自我认知微调的实战教程

本文主要介绍了大模型自我认知微调的实战教程,希望对学习大语言模型的同学们有所帮助。微调成功并保留原有能力的截图如下所示: 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 3. 实战代码 3.1 配置数据集 3.2 lora微调

herosunly的博客 4万+

分页SQL存储过程

create PROCEDURE [dbo].[pr_com_QuerySQLPaged] @Query nvarchar(MAX), --SQL语句 @PageSize int, --每页大小 @CurrentPage int , --当前页码 @Field nvarchar(40)='', --排序字段 @Order nvarchar(10) = 'asc ' --排序顺序 AS dec.

kuyz1的专栏 862

跨越边界:用MessagePipe实现无缝的进程间通信

MessagePipe是一个用于.NET平台的消息传递库,它专注于简化异步消息处理和进程间通信。通过提供一系列易于使用的API,开发者可以快速搭建起稳定可靠的通信管道,支持多种传输协议(如TCP、Unix域套接字等),并内置了序列化/反序列化功能,使得跨语言和跨平台的数据交换变得轻而易举。为了方便序列化和反序列化操作,我们需要为每种消息定义对应的类或结构体,并标记属性。这样可以确保消息在发送方和接收方之间正确无误地传递。[Key0set;[Key1set;

墨夶的博客 817

SQL存储过程实现分页

第一种:简单的分页实现 DECLARE @pagenum AS INT, @pagesize AS INT SET @pagenum = 2 --指定显示的页码 SET @pagesize = 3 --每页的条数 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY score[字段] DESC, speaker[字段]) AS rown

左右为南的专栏 665

基于STM32、HAL库、I2C接口的姿态传感器/陀螺仪之ICM-42670-P驱动 C语言程序设计

/ 设置加速度计和陀螺仪的工作模式。// 读取加速度计和陀螺仪数据。

corlin6688的博客 1183

高通Camx功能feature分析之十:高通NCS服务之注册和启动

本文介绍了高通NCS(非相机传感器)服务的注册与启动流程。NCS通过QMI接口访问陀螺仪等传感器,为相机EIS/AEC等功能提供辅助数据。文章详细解析了服务注册时的QueryCapabilites能力查询、RegisterService注册流程,以及通过StartNCSService启动服务线程的过程。重点包括:1)AF/EIS等节点通过NCSService创建传感器对象;2)注册时需校验传感器类型和接口;3)首次注册成功后会启动NCS服务线程;4)采样率变化时需重新配置会话。通过线程池管理实现传感器数据的

1264

浅谈五种SqlServer存储过程分页方式

浅谈五种SqlServer存储过程分页方式基础数据方式方式一:利用 Select Top 和 Select Not In方式二:利用 Select Top 和 Max(列键) 函数方式三:利用 Select Top 和 中间变量方式四:利用 Row_Number()方式五:利用 CTE 和 Row_Number()执行测试统计结果参考资料Digression 基础数据 --定义表结构 CREATE...

codeRandom 1026

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

君逍遥o 1018

sql 存储过程分页

系统存储过程sp_depends这个存储过程专门用来查看一个数据库对象引用了哪些其它的数据库对象 比如要看一个存储过程用到了哪些表及字段,就可以写: exec sp_depends sp_procedure 如果是表名要加引号 exec sp_depends MyTable 同样可以检查触发器 这个存储过程对于检查一个存储过程是很方便的,我们使用它就可以看到存储过程

shuilv2000的专栏 730

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SQL 分页存储过程实战指南

在数据库应用中,分页是一种常见的需求,特别是在展示大量数据时。使用 SQL 存储过程实现分页不仅可以提高查询效率,还能增强代码的可维护性和安全性。本文将介绍如何使用 SQL 存储过程实现分页查询。

DotNet技术匠 1590

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Sql分页存储过程

/*分页存储过程*/drop proc Proc_ListPageCreate proc Proc_ListPage( @tblName   nvarchar(200),          ----要显示的表或多个表的连接 @fldName   nvarchar(500) = *,    ----要显示的字段列表 @pageSize  int = 10,               ----每

1984

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SQL 分页存储过程

SQL 分页存储过程 支持:多表连接查询、Group by分组查询等。(多表连接查询时请指定字段,不要用SELECT *) 返回为一结果集,有一个输出参数为记录总数,配合AspNetPager控件使用绝配。 CREATE PROCEDURE web_pager ( @rowsTotal INT OUTPUT, --输出记录总数 @tableName V...

huang714的专栏 942

sql分页存储过程有排序

USE [GomeCPS]GO/****** Object: StoredProcedure [dbo].[proc_DataPagination] Script Date: 01/21/2016 15:58:06 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO /****************************...

abs636636的博客 188

SQL通用分页存储过程

SQL通用分页存储过程 SQL2000 /********************************************************************************* * Function: SqlPage * Description: * 超强通...

XR1986687846的博客 223

SQL分页语句及简单的SQL分页存储过程

假分页:从数据库中选择所有的记录后再进行分页真分页:只从数据库中选择当前页的记录     Sql代码 <a title="复制代码" onclick="function onclick(){dp.sh.Toolbar.CopyToClipboard(this);return false;}" href="http://writeblog.csdn.net/#

意大利香肠 716

Delphi调用SQL分页存储过程实例

//-----下面是一个支持任意表的 SQL SERVER2000分页存储过程//----分页存储过程开始创建-----------------------------------------------------------------------------------------------------------IF EXISTS (SELECT name FROM sysobj

Hsu Chong 的专栏 1280

C#调用SQL Server分页存储过程

C#调用SQL Server分页存储过程

中国风 5295

asp+sql2000存储过程分页实例

1.返回记录集总数存储过程:CREATE procedure dbo.recordCount(@TableName nvarchar(100),--数据库表名@strWhere nvarchar(500),--查询条件@count int output---输出值,记录集总数)asdeclare @sqlStr nvarchar(1000)if @strWhere !=    set @sql

一天到晚游泳的鱼^_^ 6479

SQL分页存储过程

<div id="_mcePaste">--存储过程实现分页</div><div id="_mcePaste">if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_splitpage]') and OBJECTPROPERTY(id, N'IsProcedure') = ...

weixin_30737363的博客 121
上一篇: 一个不错的.NET例子
下一篇: 存储过程
JavaProgramers
博客等级 码龄22年 660粉丝 304原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值