首页 数据库 mysql教程 2分法-通用存储过程分页(top max模式)版本_MySQL

2分法-通用存储过程分页(top max模式)版本_MySQL

Jun 01, 2016 pm 02:05 PM
set 存储 模式 版本 过程 通用

--/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/
--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/
--/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/
--/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-------*/
--/*-----存储过程 分页处理 孙伟 2005-06-15修改 多字段排序修改-------*/
--/*-----存储过程 分页处理 孙伟 2005-12-13修改 修改数据分页方式为top max模式 性能有极大提高-------*/
--/*-----缺点:相对之前的not in版本主键只能是整型字段,如主键为GUID类型请使用not in 模式的版本-------*/
CREATE PROCEDURE dbo.proc_ListPageInt
(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@pageSize int = 10, ----每页显示的记录个数
@page int = 1, ----要显示那一页的记录
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output, ----查询到的记录数
@fldSort nvarchar(200) = null, ----排序字段列表或条件
@Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150), ----主表的主键
@Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句
Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句
Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句

Declare @strSortType nvarchar(10) ----数据排序规则A
Declare @strFSortType nvarchar(10) ----数据排序规则B

Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造
Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造


if @Dist = 0
begin
set @SqlSelect = 'select '
set @SqlCounts = 'Count(*)'
end
else
begin
set @SqlSelect = 'select distinct '
set @SqlCounts = 'Count(DISTINCT ' @ID ')'
end


if @Sort=0
begin
set @strFSortType=' ASC '
set @strSortType=' DESC '
end
else
begin
set @strFSortType=' DESC '
set @strSortType=' ASC '
end

--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
set @sqlTmp = @fldName ' From ' @tblName
set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName
set @strID = ' From ' @tblName
end
else
begin
set @sqlTmp = @fldName 'From ' @tblName ' where (1>0) ' @strCondition
set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName ' where (1>0) ' @strCondition
set @strID = ' From ' @tblName ' where (1>0) ' @strCondition
end

----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
declare @tmpCounts int
if @Counts = 0
set @tmpCounts = 1
else
set @tmpCounts = @Counts

--取得分页总数
set @pageCount=(@tmpCounts @pageSize-1)/@pageSize

/**//**当前页大于总页数 取最后一页**/
if @page>@pageCount
set @page=@pageCount

--/*-----数据分页2分处理-------*/
declare @pageIndex int --总数/页大小
declare @lastcount int --总数%页大小

set @pageIndex = @tmpCounts/@pageSize
set @lastcount = @tmpCounts%@pageSize
if @lastcount > 0
set @pageIndex = @pageIndex 1
else
set @lastcount = @pagesize

--//***显示分页
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
if @pageIndex begin
if @page=1
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' order by ' @fldSort ' ' @strFSortType
else
begin
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' ' order by ' @fldSort ' ' @strFSortType ') AS TBMinID)'
' order by ' @fldSort ' ' @strFSortType
end
end
else
begin
set @page = @pageIndex-@page 1 --后半部分数据处理
if @page set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@lastcount as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
else
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' >(select max(' @ID ') from(' @SqlSelect ' top ' CAST(@pageSize*(@page-2) @lastcount as Varchar(20)) ' ' @ID ' from ' @tblName
' order by ' @fldSort ' ' @strSortType ') AS TBMaxID)'
' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
end
end

else --有查询条件
begin
if @pageIndex begin
if @page=1
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where 1=1 ' @strCondition ' order by ' @fldSort ' ' @strFSortType
else
begin
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' ' where (1=1) ' @strCondition ' order by ' @fldSort ' ' @strFSortType ') AS TBMinID)'
' ' @strCondition ' order by ' @fldSort ' ' @strFSortType
end
end
else
begin
set @page = @pageIndex-@page 1 --后半部分数据处理
if @page set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@lastcount as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where (1=1) ' @strCondition ' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
else
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' >(select max(' @ID ') from(' @SqlSelect ' top ' CAST(@pageSize*(@page-2) @lastcount as Varchar(20)) ' ' @ID ' from ' @tblName
' where (1=1) ' @strCondition ' order by ' @fldSort ' ' @strSortType ') AS TBMaxID)'
' ' @strCondition ' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
end
end

------返回查询结果-----
exec sp_executesql @strTmp
--print @strTmp
SET NOCOUNT OFF
GO
调用方法列子:
/**////


/// 通用分页数据读取函数
/// 注意:在函数调用外部打开和关闭连接,以及关闭数据读取器
///

/// SqlCommand对象
/// 查询的表/表联合
/// 要查询的字段名
/// 每页数据大小
/// 当前第几页
/// 排序字段
/// 排序顺序0降序1升序
/// 过滤条件
/// 主表主键
/// 返回的SqlDataReader ref
public static void CutPageData(SqlConnection conn, ref SqlCommand comm, string _tblName, string _fldName, int _pageSize, int _page, string _fldSort, int _Sort, string _strCondition, string _ID, ref SqlDataReader _dr)
{
//注意:在函数调用外部打开和关闭连接,以及关闭数据读取器
//comm = new SqlCommand("proc_ListPage",conn);
//comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@tblName", SqlDbType.NVarChar, 200);
comm.Parameters["@tblName"].Value = _tblName;
comm.Parameters.Add("@fldName", SqlDbType.NVarChar, 500);
comm.Parameters["@fldName"].Value = _fldName;
comm.Parameters.Add("@pageSize", SqlDbType.Int);
comm.Parameters["@pageSize"].Value = _pageSize;
comm.Parameters.Add("@page", SqlDbType.Int);
comm.Parameters["@page"].Value = _page;
comm.Parameters.Add("@fldSort", SqlDbType.NVarChar, 200);
comm.Parameters["@fldSort"].Value = _fldSort;
comm.Parameters.Add("@Sort", SqlDbType.Bit);
comm.Parameters["@Sort"].Value = _Sort;
comm.Parameters.Add("@strCondition", SqlDbType.NVarChar, 1000);
comm.Parameters["@strCondition"].Value = _strCondition;
comm.Parameters.Add("@ID", SqlDbType.NVarChar, 150);
comm.Parameters["@ID"].Value = _ID;
comm.Parameters.Add("@Counts", SqlDbType.Int, 0);
comm.Parameters["@Counts"].Direction = ParameterDirection.Output;
comm.Parameters.Add("@pageCount", SqlDbType.Int, 0);
comm.Parameters["@pageCount"].Direction = ParameterDirection.Output;

_dr = comm.ExecuteReader();
}
调用例如:
CutPageData(conn, ref comm, "VOX_CDSinger", "id, cdsinger, cdsingertype, area, cdsingerreadme", 15, page, "id", 1, strFilter, "id", ref dr);
对应说明:
CutPageData(数据连接对象, ref Sqlcommand对象, "需要表或视图名称", "要查询的字段", 每页读取数据条数, 当前页, "排序字段可多字段如(addtime desc, visitcounts注意这里最后一个字段不加desc或asc 最后一个字段对应于后面的排序规则)", 排序方式(1 desc 0 asc), where条件(这里不再添加where条件添加如:' and visitcounts>100'), 表主键, ref 返回的SqlDataReader对象);

这里的调用同样适用于之前的not in版本.


呵呵 这里献给大家 圣诞快乐 !

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

微信的免打扰模式有什么作用 微信的免打扰模式有什么作用 Feb 23, 2024 pm 10:48 PM

微信勿扰模式什么意思如今,随着智能手机的普及和移动互联网的迅猛发展,社交媒体平台已经成为人们日常生活中不可或缺的一部分。而微信作为国内最流行的社交媒体平台之一,几乎每个人都有一个微信账号。我们可以通过微信与朋友、家人、同事进行实时沟通,分享生活中的点滴,了解彼此的近况。然而,在这个时代,我们也不可避免地面临着信息过载和隐私泄露的问题,特别是对于那些需要专注或

Linux下更新curl版本教程! Linux下更新curl版本教程! Mar 07, 2024 am 08:30 AM

在Linux下更新curl版本,您可以按照以下步骤进行操作:检查当前curl版本:首先,您需要确定当前系统中安装的curl版本。打开终端,并执行以下命令:curl--version该命令将显示当前curl的版本信息。确认可用的curl版本:在更新curl之前,您需要确定可用的最新版本。您可以访问curl的官方网站(curl.haxx.se)或相关的软件源,查找最新版本的curl。下载curl源代码:使用curl或浏览器,下载您选择的curl版本的源代码文件(通常为.tar.gz或.tar.bz2

更新pip版本的简单步骤:1分钟内完成 更新pip版本的简单步骤:1分钟内完成 Jan 27, 2024 am 09:45 AM

一分钟搞定:如何更新pip版本,需要具体代码示例随着Python的快速发展,pip成为了Python包管理的标准工具。然而,随着时间的推移,pip版本也在不断更新,为了能够使用最新的功能和修复可能的安全漏洞,更新pip版本是非常重要的。本文将介绍如何在一分钟内快速更新pip,并提供具体的代码示例。首先,我们需要打开命令行窗口。在Windows系统中,可以使用

查看麒麟操作系统版本和内核版本 查看麒麟操作系统版本和内核版本 Feb 21, 2024 pm 07:04 PM

查看麒麟操作系统版本和内核版本在麒麟操作系统中,了解如何查看系统版本和内核版本是进行系统管理和维护的基础。查看麒麟操作系统版本方法一:使用/etc/.kyinfo文件要查看麒麟操作系统的版本,您可以查看/etc/.kyinfo文件。此文件包含了操作系统的版本信息。执行以下命令:cat/etc/.kyinfo此命令将显示操作系统的详细版本信息。方法二:使用/etc/issue文件另一个查看操作系统版本的方法是通过查看/etc/issue文件。这个文件同样提供了版本信息,但可能不如.kyinfo文件

华为明年将推创新 MED 存储产品:机架容量超过 10 PB,功耗低于 2 kW 华为明年将推创新 MED 存储产品:机架容量超过 10 PB,功耗低于 2 kW Mar 07, 2024 pm 10:43 PM

本站3月7日消息,华为数据存储产品线总裁周跃峰博士日前出席MWC2024大会,专门展示了为温数据(WarmData)和冷数据(ColdData)设计的新一代OceanStorArctic磁电存储解决方案。华为数据存储产品线总裁周跃峰发布系列创新解决方案图源:华为本站附上华为官方新闻稿内容如下:该方案的成本比磁带低20%,功耗比硬盘低90%。根据国外科技媒体blocksandfiles报道,华为发言人还透露了关于该磁电存储解决方案的信息:华为的磁电磁盘(MED)是对磁存储介质的重大创新。第一代ME

详解MyBatis动态SQL标签中的Set标签功能 详解MyBatis动态SQL标签中的Set标签功能 Feb 26, 2024 pm 07:48 PM

MyBatis动态SQL标签解读:Set标签用法详解MyBatis是一个优秀的持久层框架,它提供了丰富的动态SQL标签,可以灵活地构建数据库操作语句。其中,Set标签是用于生成UPDATE语句中SET子句的标签,在更新操作中非常常用。本文将详细解读MyBatis中Set标签的用法,以及通过具体的代码示例来演示其功能。什么是Set标签Set标签用于MyBati

解读PHP版本NTS的含义与区别 解读PHP版本NTS的含义与区别 Mar 27, 2024 am 11:48 AM

PHP版本NTS的含义与区别PHP是一种流行的服务器端脚本语言,广泛应用于Web开发领域。PHP有两种主要的版本:ThreadSafe(TS)和Non-ThreadSafe(NTS)。在PHP的官方网站上,我们可以看到两个不同的PHP下载版本,分别是PHPNTS和PHPTS。那么,PHP版本NTS是什么意思?它和TS版本有什么区别呢?接下来,

如何轻松查看Oracle的安装版本 如何轻松查看Oracle的安装版本 Mar 07, 2024 am 11:27 AM

如何轻松查看Oracle的安装版本,需要具体代码示例作为一款被广泛应用于企业级数据库管理系统的软件,Oracle数据库具有许多版本和不同的安装方式。在日常工作中,我们经常需要查看Oracle数据库的安装版本,以便进行相应的操作和维护。本文将介绍如何轻松地查看Oracle的安装版本,并给出具体的代码示例。方法一:通过SQL查询在Oracle数据库中,我们可以通

See all articles