存储过程分页的算法,大家来看看.(才接触存储过程分页) 子查询的TOP我是用(页大小*(页数-1))算出来的。 20*(3000-1)即第3000页内容用了一分多钟!!!自己看了一便,才发现这句话打错了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你查询出总数这完全可以,但是你的程序其实不应该显示超过500页,应该 PageIndexChanging 事件处理程序中写: Int32 PageNumber=e.NewPageIndex; if(PageNumber>500) { Page.ClientScript.RegisterStartupScript(this.GetType(),"page error", "alert('无法显示过多翻页数据。请缩小查询范围进行查询列表。')",true); PageNumber=500; } ....... //设置页号、绑定数据我看了一下百度,在我显示740条数据(74页)的时候,就已经不翻页了。 其实这里我应该给你把示例写成50页,而不是500页。因为百度也不过那样而已嘛。关于翻页的讨论学究气比较重,仅仅纠缠于SQL查询等技术写法,少了一些更为必要的东西的描述。 哦,忘记了说一件重要的事情:当你确定将控制逻辑限制为仅列出500条明细(假设每页20条记录那么就是仅列出25页,这个数量不大)时,那些对“分页算法”的过分追捧就没有必要了,你完全可以用ADO.NET的: System.Data.Common.DbDataAdapter.Fill(dataSet,startRecord,maxRecords,srcTable)或者你的可绑定的ui控件的原有的分页功能。 你的存储过程效率也太低了!给你个(测试过,效率很高,尤其是海量数据)ALTER PROCEDURE pager@tblName varchar(255), -- 表名@strGetFields varchar(1000), -- 需要返回的列@fldName varchar(255), -- 排序的字段名@PageSize int , -- 页尺寸@PageIndex int, -- 页码@doCount int , -- 返回记录总数, 非0 值则返回@OrderType int = 0, -- 设置排序类型, 非0 值则降序@strWhere varchar(1500) = '' -- 查询条件(注意: 不要加where)ASdeclare @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传递过来的不是,就执行总数统计。以下的所有代码都是@doCount为的情况elsebegin if @OrderType != 0begin set @strTmp = '<(select min'set @strOrder = ' order by [''' + @fldName +'''] desc'--如果@OrderType不是,就执行降序!endelsebegin 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 + '''] '+ @strOrderendelsebegin--以下代码赋予了@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 + ' ' + @strOrderend end exec (@strSQL) --以下代码赋予了@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(['''+ @fldName + ''')换成(['''+ @fldName + ''']),少了] 开源<C#按键精灵---钩子程序> 关于FreeTextBox控件问题 如何实现像webpart那样可以拖动的界面? 帮我看看错误 新手请教:关于用户控件里的图片的路径问题。怎么实现多级目录共用一个用户控件。帮我看看。谢谢! 如何判断一个时间是否在一个时间段内呢? 帮我看看这段小代码为什么不能正确执行? 高分求救!!!!SQL 2000 与7.0问题. 怎么会出现这样的问题???有关数据库帮定!!! 用Session[Session.ID,"name"]能长时间的不过期吗 关于AJAX的新手问题! 这样的窗口弹出窗口,当如何作?
if(PageNumber>500)
{
Page.ClientScript.RegisterStartupScript(this.GetType(),"page error",
"alert('无法显示过多翻页数据。请缩小查询范围进行查询列表。')",true);
PageNumber=500;
}
....... //设置页号、绑定数据
我看了一下百度,在我显示740条数据(74页)的时候,就已经不翻页了。
ALTER PROCEDURE pager@tblName varchar(255), -- 表名@strGetFields varchar(1000), -- 需要返回的列@fldName varchar(255), -- 排序的字段名@PageSize int , -- 页尺寸@PageIndex int, -- 页码@doCount int , -- 返回记录总数, 非0 值则返回@OrderType int = 0, -- 设置排序类型, 非0 值则降序@strWhere varchar(1500) = '' -- 查询条件(注意: 不要加where)ASdeclare @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传递过来的不是,就执行总数统计。以下的所有代码都是@doCount为的情况elsebegin if @OrderType != 0begin set @strTmp = '<(select min'set @strOrder = ' order by [''' + @fldName +'''] desc'--如果@OrderType不是,就执行降序!endelsebegin 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 + '''] '+ @strOrderendelsebegin--以下代码赋予了@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 + ' ' + @strOrderend end exec (@strSQL)