时间:2021-05-02
最近在做一个几百万条数据的分页查询,研究了各种方案,在本机上用项目的实际数据库做测试,测试过程 is very 痛苦,不堪回首ing。现在废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看的方式。
以下是存储过程的代码:
复制代码 代码如下:
CREATE PROCEDURE [dbo].[P_GridViewPager] (
@recordTotal INT OUTPUT,--输出记录总数
@viewName VARCHAR(800),--表名
@fieldName VARCHAR(800) = '*',--查询字段
@keyName VARCHAR(200) = 'Id',--索引字段
@pageSize INT = 20,--每页记录数
@pageNo INT =1,--当前页
@orderString VARCHAR(200),--排序条件
@whereString VARCHAR(800) = '1=1' --WHERE条件
)
AS
BEGIN
DECLARE @beginRow INT
DECLARE @endRow INT
DECLARE @tempLimit VARCHAR(200)
DECLARE @tempCount NVARCHAR(1000)
DECLARE @tempMain VARCHAR(1000)
--declare @timediff datetime
set nocount on
--select @timediff=getdate() --记录时间
SET @beginRow = (@pageNo - 1) * @pageSize + 1
SET @endRow = @pageNo * @pageSize
SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR)
--输出参数为总记录数
SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp'
EXECUTE sp_executesql @tempCount,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT
--主查询返回结果集
SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by '+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE '+@whereString+') AS main_temp WHERE '+@tempLimit
--PRINT @tempMain
EXECUTE (@tempMain)
--select datediff(ms,@timediff,getdate()) as 耗时
set nocount off
END
GO
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了MSSQL分页存储过程。分享给大家供大家参考,具体如下:USE[DB_Common]GO/******对象:StoredProcedure[dbo
本文实例讲述了PHP使用PDO调用mssql存储过程的方法。分享给大家供大家参考,具体如下:数据库中已创建存储过程user_logon_check,PHP调用示
一、建立存储过程 在MSSQL中的Northwind数据库中为employess表新建存储过程(作用按LastName进行模糊查询):CREATEPROC
下面就是和大家分享的实现无刷新分页功能的全部步骤,欢迎学习。1、新建一个分页存储过程:CREATEprocedure[dbo].[P_Pager](@PageN
在google中搜索“分页存储过程”会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如果你觉得我错了,