标题:[求助]高效SQL分页存储过程,非常感谢!
只看楼主
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
结帖率:100%
 问题点数:0 回复次数:8 
[求助]高效SQL分页存储过程,非常感谢!

此为网上找到的高效SQL分页存储过程,但是不理解其中的含义和用法,研究了几天了一点头绪也没有!


CREATE PROCEDURE fenye

@tblName varchar(255)='wdf1', -- 表名

@strGetFields varchar(1000) = '*', -- 需要返回的列

@fldName varchar(255)='userid', -- 排序的字段名

@PageSize int = 10, -- 页尺寸

@PageIndex int = 1, -- 页码

@doCount bit = 0, -- 返回记录总数, 非 0 值则返回

@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000) -- 主语句

declare @strTmp varchar(110) -- 临时变量

declare @strOrder varchar(400) -- 排序类型

if @doCount != 0

begin

if @strWhere !=''

set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere

else

set @strSQL = "select count(*) as Total from [" + @tblName + "]"

end

--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

else

begin

if @OrderType != 0

begin

set @strTmp = "<(select min"

set @strOrder = " order by [" + @fldName +"] desc"

--如果@OrderType不是0,就执行降序,这句很重要!

end

else

begin

set @strTmp = ">(select max"

set @strOrder = " order by [" + @fldName +"] asc"

end

if @PageIndex = 1

begin

if @strWhere != ''

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder

else

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["+ @tblName + "] "+ @strOrder

--如果是第一页就执行以上代码,这样会加快执行速度

end

else

begin

--以下代码赋予了@strSQL以真正执行的SQL代码

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["

+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder

if @strWhere != ''

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["

+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["

+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["

+ @fldName + "] from [" + @tblName + "] where " + @strWhere + " "

+ @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

end

end

exec (@strSQL)
GO

希望知道的朋友帮忙在ASP中写个实例代码调用这个存储过程,能实际高效运行分页的代码,有代码就行,分析由我自己来,非常感谢!

搜索更多相关主题的帖子: SQL varchar int bit 
2007-10-23 16:50
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
得分:0 
原理是利用查询的 top 方法

从明天起做幸福的人,喂马劈柴周游世界!
2007-10-23 19:26
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
得分:0 
原理我也看了,可就是在实际使用上就是无法实例化,不知道哪个细节出问题了!网上也找不到实例!
简单分页和高效分页的存储过程差别太大,高效分页复杂得很多,真难搞董!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2007-10-24 09:47
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
得分:0 

哎,好郁闷,重复简单或不复杂的问题天天都有人讨论,这么重要实用的代码切没几个人谈起!难道大家重来不使用分页存储过程,没遇到过上百万条数据的情况?


Q:1428196631,百度:开发地 即可找到我,有事请留言!
2007-10-24 13:33
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
得分:0 

我用的分页就是通过上面的进行改善而来的。。。

应该说现在网上找到的许多分页技术,上面的算我目前看到是最快的方法


从明天起做幸福的人,喂马劈柴周游世界!
2007-10-24 13:49
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
得分:0 

请有做过高效分页存储过程的朋友,把具体ASP调用代码发一下(已经调试,确实可用的),以共大家学习参考。非常感谢!


Q:1428196631,百度:开发地 即可找到我,有事请留言!
2007-10-24 16:21
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
得分:0 

明天有时间整理一个出来,从HTML代码到存储过程


从明天起做幸福的人,喂马劈柴周游世界!
2007-10-24 19:13
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
得分:0 
谢谢天涯听雨!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2007-10-25 10:47
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
得分:0 
已经发布了……

从明天起做幸福的人,喂马劈柴周游世界!
2007-10-25 10:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-180142-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023222 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved