注册 登录
编程论坛 ASP技术论坛

[求助]高效SQL分页存储过程,非常感谢!

gupiao175 发布于 2007-10-23 16:50, 1366 次点击

此为网上找到的高效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中写个实例代码调用这个存储过程,能实际高效运行分页的代码,有代码就行,分析由我自己来,非常感谢!

8 回复
#2
天涯听雨2007-10-23 19:26
原理是利用查询的 top 方法
#3
gupiao1752007-10-24 09:47
原理我也看了,可就是在实际使用上就是无法实例化,不知道哪个细节出问题了!网上也找不到实例!
简单分页和高效分页的存储过程差别太大,高效分页复杂得很多,真难搞董!
#4
gupiao1752007-10-24 13:33

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

#5
天涯听雨2007-10-24 13:49

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

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

#6
gupiao1752007-10-24 16:21

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

#7
天涯听雨2007-10-24 19:13

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

#8
gupiao1752007-10-25 10:47
谢谢天涯听雨!
#9
天涯听雨2007-10-25 10:48
已经发布了……
1