sqlserver 通用存储过程分页代码(附使用ROW_NUMBER()

存储过程当中如果每次都统计记录总数将会严重影响效率,相同的查询条件记录总数必定是相同的,所以如果第一页执行之后把记录总数保存起来,点击其他页次的时候命令存储过
程不再统计记录总数将会大大提高系统性能。通过测试结果看出每次都要统计总记录数使用ROW_NUMBER()和不使用ROW_NUMBER()差别不是太大,如果仅第一次统计总记录数使用ROW_NUMBER()将
会比不使用ROW_NUMBER()的效率提高很多。

结构:
复制代码 代码如下:

CREATE TABLE [dbo].[Xtest]( [ID] [bigint] IDENTITY(1,1) NOT NULL, [XName] [nvarchar](50) NULL, [XDemo] [nvarchar](500) NULL, CONSTRAINT [PK_xtest] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

插入50万条数据:
复制代码 代码如下:

declare @i int
set @i=1
while(@ibegin
insert into dbo.Xtest(XName,XDemo) values(CAST(@i as varchar)+’name’+CAST(@i as varchar),’这是第’+CAST(@i as varchar)+’的内容’)
set @i=@i+1
end

另外对XName建立索引。
存储过程如下:
复制代码 代码如下:
— =============================================
— Author:
— Create date:
— Description: 调用方法: sp_Pager2000 ‘xtest’,’*’,’ID’,’ORDER BY ID ASC’,’xname like ”%222name%”’,3,20,0,0
— =============================================

ALTER PROCEDURE [dbo].[sp_Pager2000]
@tblName varchar(255), — 表名如:’xtest’
@strGetFields varchar(1000) = ‘*’, — 需要返回的列如:’xname,xdemo’
@pkName nvarchar(50)=’ID’, — 主键名
@strOrder varchar(255)=”, — 排序的字段名如:’order by id desc’
@strWhere varchar(1500) = ”, — 查询条件(注意:不要加where)如:’xname like ”%222name%”’
@pageIndex int = 1, — 页码如:2
@pageSize int = 20, — 每页记录数如:20
@recordCount int=0 out, — 记录总数
@doCount bit=0 — 非0则统计,为0则不统计(统计会影响效率)
AS
Declare @sql nvarchar(4000)
Declare @sqltemp nvarchar(1000)
set @sql=’ From ‘+@tblName
if(@strWhere!=”) set @sql=@sql+’ Where ‘+@strWhere
declare @strCount nvarchar(1000)
–总记录条数
if(@doCount!=0)
begin
if(@strWhere !=”)
begin
set @strCount=’set @num=(select count(1) from ‘+ @tblName + ‘ where ‘+@strWhere+’ )’
end
else
begin
set @strCount=’set @num=(select count(1) from ‘+ @tblName + ‘ )’
end
EXECUTE sp_executesql @strCount ,N’@num INT output’,@RecordCount output
end
if @strWhere !=”
begin
set @strWhere=’ where ‘+@strWhere
end
if (@PageIndex>1)
begin
set @sqltemp=@PKName+’ not in (Select Top ‘+cast((@PageSize*(@PageIndex-1)) as nvarchar)+’ ‘+@PKName+’ ‘+@sql
if(@strOrder!=”)set @sqltemp=@sqltemp+’ ‘+@strOrder
set @sqltemp=@sqltemp+’)’
set @sql=’Select Top ‘+cast(@PageSize as nvarchar)+’ ‘+@strGetFields+’ ‘+@sql
if(@strWhere!=”)set @sql=@sql+’ And ‘+@sqltemp
else set @sql=@sql+’ Where ‘+@sqltemp
end
else
begin
set @sql=’Select Top ‘+cast(@PageSize as nvarchar)+’ ‘+@strGetFields+’ ‘+@sql
end
if(@strOrder!=”) set @sql=@sql+’ ‘+@strOrder
exec(@sql)

— =============================================
— Author:
— Create date:
— Description: 调用方法: sp_Pager2005 ‘xtest’,’*’,’ORDER BY ID ASC’,’xname like ”%222name%”’,2,20,0,0
— =============================================
ALTER PROCEDURE [dbo].[sp_Pager2005]
@tblName varchar(255), — 表名如:’xtest’
@strGetFields varchar(1000) = ‘*’, — 需要返回的列如:’xname,xdemo’
@strOrder varchar(255)=”, — 排序的字段名如:’order by id desc’
@strWhere varchar(1500) = ”, — 查询条件(注意:不要加where)如:’xname like ”%222name%”’
@pageIndex int = 1, — 页码如:2
@pageSize int = 20, — 每页记录数如:20
@recordCount int output, — 记录总数
@doCount bit=0 — 非0则统计,为0则不统计(统计会影响效率)
AS
declare @strSQL varchar(5000)
declare @strCount nvarchar(1000)
–总记录条数
if(@doCount!=0)
begin
if(@strWhere !=”)
begin
set @strCount=’set @num=(select count(1) from ‘+ @tblName + ‘ where ‘+@strWhere+’ )’
end
else
begin
set @strCount=’set @num=(select count(1) from ‘+ @tblName + ‘ )’
end
EXECUTE sp_executesql @strCount ,N’@num INT output’,@RecordCount output
end
if @strWhere !=”
begin
set @strWhere=’ where ‘+@strWhere
end
set @strSQL=’SELECT * FROM (SELECT ROW_NUMBER() OVER (‘+@strOrder+’) AS ROWID,’
set @strSQL=@strSQL+@strGetFields+’ FROM [‘+@tblName+’] ‘+@strWhere
set @strSQL=@strSQL+’) AS sp WHERE ROWID BETWEEN ‘+str((@PageIndex-1)*@PageSize+1)
set @strSQL=@strSQL+’ AND ‘+str(@PageIndex*@PageSize)
exec (@strSQL)

对上面两个存储过程进行了测试,测试环境:酷睿2双核2.20Gh,1G内存,SQL SERVER2008
对50万条数据进行了分页查询测试
查询的条件是:xname like ‘%222name%’
“page1:2秒937毫秒”:表示打开第一页使用的时间,其他依次类推
不使用ROW_NUMBER()每页都要统计:
page1:2秒937毫秒
page2:3秒140毫秒
page3:3秒453毫秒
page4:3秒609毫秒
page5:3秒843毫秒
page6:4秒156毫秒
不使用ROW_NUMBER()仅第一页统计:
page1:2秒937毫秒
page2:0秒343毫秒
page3:0秒593毫秒
page4:0秒812毫秒
page5:1秒46毫秒
page6:1秒281毫秒
使用ROW_NUMBER()每页都要统计:
page1:2秒937毫秒
page2:3秒31毫秒
page3:3秒156毫秒
page4:3秒296毫秒
page5:3秒421毫秒
page6:3秒515毫秒
使用ROW_NUMBER()仅第一页统计:
page1:2秒937毫秒
page2:0秒218毫秒
page3:0秒359毫秒
page4:0秒468毫秒
page5:0秒578毫秒
page6:0秒687毫秒
结论:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/506309.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
vscode一直打不开默认浏览器解决方法
上一篇 2025年11月8日 22:37:21
php表单编码方式有哪些
下一篇 2025年11月8日 22:37:26

相关推荐

  • Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]

    Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]

    大家好,很高兴再次与你们见面,我是你们的朋友全栈君。 Ubuntu安装前言最近我决定将开发环境切换到Linux系统,经过一番研究,我选择了Ubuntu桌面版,因为它不仅美观,而且作为生产系统的生态环境也非常好。于是,我开始寻找安装Ubuntu双系统的方法。安装方法有三种: 虚拟机安装:这种方法无法充…

    2026年9月21日 用户投稿
    200
  • 如何使用ThinkPHP6实现数据库分页

    随着web技术的发展和普及,越来越多的网站采用数据库分页技术,以便更好地展示大量数据。thinkphp作为一种常用的php框架,自然也推出了相应的数据库分页扩展。本篇文章将介绍如何使用thinkphp6实现数据库分页。 一、ThinkPHP的Paginator类 首先,我们需要了解一下ThinkPH…

    用户投稿 2026年9月7日
    000
  • Laravel中的文件处理和存储:管理用户上传的资源和文件

    Laravel中的文件处理和存储:管理用户上传的资源和文件 引言:在现代web应用中,用户上传和管理文件资源是非常常见的需求。Laravel作为一款流行的PHP框架,提供了强大的文件处理和存储功能,使我们能够轻松地实现用户上传和管理资源的功能。本文将介绍Laravel中的文件处理和存储机制,以及一些…

    2026年9月3日
    200
  • 机构:下半年NAND Flash市场供需改善,价格有望回升

    nand flash市场下半年有望回暖!trendforce最新报告指出,多重因素将推动nand flash需求增长,缓解供过于求的局面,并预期下半年价格将回升。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 报告显示,NAND Flash…

    2026年9月1日
    000
  • ThinkPHP开发注意事项:合理使用分页功能

    ThinkPHP是一个强大的PHP开发框架,提供了丰富的功能和组件,方便开发者快速构建Web应用程序。在使用ThinkPHP开发时,经常会遇到需要使用分页功能来展示大量数据的情况。合理使用分页功能可以提升系统性能,用户体验和开发效率。本文将讨论在ThinkPHP开发中,合理使用分页功能的注意事项。 …

    2026年8月31日
    000
  • RuoYi框架代码生成器如何适配SQL Server数据库?

    RuoYi-SQLServer 代码生成器适配:从 MySQL 到 SQL Server 的迁移 ruoyi框架的sqlserver版本(ruoyi-sqlserver)原本只支持mysql数据库的代码自动生成功能,现在需要将其扩展到sql server。这篇文章将探讨如何修改代码,实现sql se…

    用户投稿 2026年8月28日
    200
  • 领先三星:SK 海力士被曝推进 1c DRAM 六层 EUV 工艺

    8 月 12 日消息,科技媒体 wccftech 昨日(8 月 11 日)发布博文,指出 sk 海力士(sk hynix)为提升 ddr5 与高带宽存储(hbm)产品的性能,并在先进存储技术领域保持领先,正计划在 1c dram 的量产中引入六层极紫外光(euv)工艺。 报道称,这一技术方案不仅打破…

    2026年8月25日
    100
  • html怎么制作分页效果 内容分页显示实现方法

    html怎么制作分页效果 内容分页显示实现方法html怎么制作分页效果 内容分页显示实现方法html怎么制作分页效果 内容分页显示实现方法html怎么制作分页效果 内容分页显示实现方法

    html本身不能直接实现分页效果,因为它是标记语言,仅负责页面结构。1. 分页需结合后端处理数据并分割内容,2. 前端通过javascript发送请求获取指定页码数据,3. 后端以json格式返回对应数据,4. 前端渲染接收到的数据到页面上,5. 使用javascript动态生成分页导航链接。示例中…

    2025年12月22日 用户投稿
    300
  • 探秘浏览器中cookie的存储机制

    探秘浏览器中cookie的存储机制 随着互联网的发展和应用的普及,人们对浏览器中的cookie(HTTP cookie)已经不再陌生。无论是在购物网站上保存购物车信息,还是在社交媒体上保存登录状态,cookie都扮演着无可替代的角色。但你是否曾经想过,浏览器是如何存储这些cookie的呢?本文将探索…

    2025年12月21日
    300
  • 正确利用sessionStorage保护敏感数据的方法

    如何正确使用sessionStorage存储敏感信息,需要具体代码示例 无论是在Web开发还是移动应用开发中,我们常常需要存储和处理敏感信息,如用户登录凭证、身份证号码等。在前端开发中,使用sessionStorage是一种常见的存储方案。然而,由于sessionStorage是基于浏览器的存储,需…

    2025年12月21日
    000
  • 探索sessionStorage:令人惊叹的用户数据存储工具

    了解sessionstorage:存储用户数据的神奇工具 导言: 随着互联网的发展,用户的个人数据使用和存储成为了一个重要的问题。为了更好地提供个性化的服务和展示给用户,很多网站和应用程序需要存储用户的一些数据。在这种情况下,sessionstorage是一种非常方便和高效的工具。本文将介绍sess…

    2025年12月21日
    000
  • 使用localstorage存储数据所需的包有哪些?

    localstorage是HTML5中的一项重要技术,它可以用来在客户端本地存储数据。在使用localstorage存储数据之前,我们需要确保在代码中引入合适的包来操作这个功能。 在使用localstorage之前,我们需要在HTML文件中添加以下代码来引入localstorage的相关包: 在以上…

    2025年12月21日
    200
  • 了解SessionStorage:存储内容和用途解析

    SessionStorage存储什么?了解它的应用场景和限制,需要具体代码示例 SessionStorage是HTML5中新增的一种Web存储机制,用于临时性保存数据,在同一个浏览器窗口或标签页下保持数据的有效性,直到窗口或标签页关闭。 SessionStorage可以存储字符串类型的数据,每个域名…

    2025年12月21日
    300
  • html代码在编写过程中的一定要注意的三点

    这次给大家带来html代码在编写过程中的一定要注意的三点,编写html代码的注意事项有哪些,下面就是实战案例,一起来看一下。 本文想说的警惕点与浏览器兼容无关,主要是几个本人在项目中遇到的几个小问题的总结,问题虽小,但是却有时很困扰人,在此记录一下,如果后期有此类问题会持续添加到这里。 1.内联标签…

    用户投稿 2025年12月21日
    000
  • H5的本地存储和本地数据库详细介绍

    这次给大家带来h5的本地存储和本地数据库详细介绍,使用h5的本地存储和本地数据库的注意事项有哪些,下面就是实战案例,一起来看一下。 本地存储 1.1 本地存储由来的背景 由于HTML4时代Cookie的大小、格式、存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cook…

    用户投稿 2025年12月21日
    000
  • js如何实现分页功能

    js实现分页的核心是计算总页数并截取对应数据展示,1. 首先准备数据数组alldata,设定每页数量pagesize和当前页currentpage;2. 通过math.ceil(alldata.length / pagesize)计算总页数totalpages;3. 利用slice()方法截取(st…

    2025年12月20日
    300
  • 如何用C++实现桥接模式 抽象与实现分离设计方案

    如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案

    c++++中桥接模式的核心优势在于解耦抽象与实现,使其能独立变化。1. 它通过将一个类中可能变动的具体操作抽离为独立的实现体系,降低类组合数量,避免“m x n”组合爆炸;2. 抽象类(如shape)包含指向实现接口的指针或引用,调用具体实现(如drawingapi),使两者互不影响;3. 适用于多…

    2025年12月18日 用户投稿
    700
  • 解释C语言中选择排序的过程

    解释C语言中选择排序的过程解释C语言中选择排序的过程解释C语言中选择排序的过程解释C语言中选择排序的过程

    选择排序是一种攻击性算法,用于从数组中找到最小的数字,然后将其放置到第一个位置。下一个要遍历的数组将从索引开始,靠近放置最小数字的位置。 选择排序的过程 选择元素列表中第一个最小的元素并将其放置在第一个位置。 对列表中的其余元素重复相同的操作,直到所有元素都获得已排序。 考虑以下列表 –…

    2025年12月17日 用户投稿
    000
  • C# Avalonia如何集成Entity Framework Core Avalonia EF Core教程

    在 Avalonia 中集成 EF Core 可行,关键在于异步操作、DI 注入 DbContextFactory 及正确管理生命周期;需避免 UI 线程阻塞,推荐用 AddDbContextFactory 而非 Scoped 或 Singleton 注册。 在 Avalonia 中集成 Entit…

    2025年12月17日
    900
  • EF Core在控制台程序中怎么用 EF Core控制台应用入门

    EF Core在控制台程序中入门只需四步:建模型、配上下文、跑迁移、写代码操作数据;依次完成项目创建与NuGet安装、定义实体类和DbContext、执行Add-Migration与Update-Database生成数据库、在Main中用Add/SaveChanges/ToList实现增删改查。 E…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信