注册 | 登录 | 设为首页 | 加入收藏
您当前的位置:飞翔学院-IT中国 → 编程开发.Net/C# → 文章内容

SQL分页的存储过程详解

作者:佚名 来源:本站整理 发布时间:2007-10-23 12:37:54
set @strOrder = ' order by [' + @fldName +'] asc'

end

-----get total recordcount ,ericsun 2004.11.24 add----
if @strWhere != ''
begin

set @strSQL='select count(*) as Total into ##tmpTable from ['+ @tblName+' ] where '+ ' '+ @strWhere
exec sp_executesql @strSQL
select @RecordCount=Total from ##tmpTable
drop table ##tmpTable
end
else
begin

set @strSQL='select count(*) as Total into ##tmpTable from ['+ @tblName+' ] '
exec sp_executesql @strSQL
select @RecordCount=Total from ##tmpTable
drop table ##tmpTable
end
------------------------------------------------------

if @PageIndex = 1
--如果是第一页就执行以上代码,这样会加快执行速度
begin

if @strWhere != ''
begin

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
end
else
begin

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

end


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 sp_executesql @strSQL --sp_executesql的默认权限是pubic

上面去记录总数的一部分已经没有什么意义了,遗憾的是改过的部分在每次翻页的时候都要执行一次,也就是每翻一页都要重新读取记录总数,真是失败,暂时没想到解决的办法...思考。。

2007-04-12 17:48 作者: 欢欢    

re: SQL分页的存储过程详解

CREATE PROCEDURE GetProductByCategory
(
@categoryId int,
@pageSize int,
@pageIndex int
)
AS

DECLARE @sql nvarchar(4000)

SET @sql = 'select top '+cast(@pagesize as varchar(20))+' * from ProductInfo
where CategoryId= '+cast(@categoryId as varchar(20))+'
and ProductInfo.ProductId not in (select top '+cast((@pageSize*@pageindex) as varchar(20))
+ ' ProductID from ProductInfo where CategoryId ='
+cast(@categoryId as varchar(20))+'order by productId) order by productId'
EXEC sp_ExecuteSql @sql

GO

最快的分页方法就是利用存储过程实现每次每页只出现需要的一页纪录集
简单的存储过程的例子(以bbs为例子,网上收藏精品);
1.我们需要的当前的页数。
2.当前定义的每一页的纪录集数目。这样你就可以根据需要在页面程序中修改每一页的纪录数。
3.一个输出参数:就是从数据库里得出当前表中总纪录数目的多少

CREATE PROCEDURE dbo.PRO_pageview
(

@tint_tableid tinyint=1,   --这个是BBS的当前版面Id,你可以不用管他。。
@int_pagenow int=0,      
@int_pagesize int=0,
@int_recordcount int=0 output  --就是得出BBS某个版面的总贴数。。

)

AS
set nocount on

declare @int_allid int    
declare @int_beginid int,@int_endid int 
declare @int_pagebegin int, @int_pageend int
  
select @int_allid=count(*) from tab_discuss where tint_level=0 and tint_tableid=@tint_tableid
  select @int_recordcount=@int_allid     --得出该版面的总贴数
      
  declare cro_fastread cursor scroll
  for  select int_id from tab_discuss where tint_level=0 and tint_tableid=@tint_tableid order by int_id desc --这里定义游标操作,但是不用临时纪录集,而且游标也不需要全部遍历所有纪录集。
  
  open cro_fastread --打开游标
  select @int_beginid=(@int_pagenow-1)*@int_pagesize+1 得出该页的第一个纪录Id
  select @int_endid = @int_beginid+@int_pagesize-1   得出该页的最后一个纪录的Id
  
  fetch absolute @int_beginid from cro_fastread into @int_pagebegin 将他的Id传给一个变量该页开始的Id
  if @int_endid>@int_allid    --这里要注意,如果某一页不足固定页数的纪录时。如只有一页纪录,而且纪录少于我们定义的数目。或者是最后一页时。。。
    fetch last from cro_fastread into @int_pageend  --直接将游标绝对定位到最后一条纪录,得出他的id号来。。。
  else
    fetch absolute @int_endid from cro_fastread into @int_pageend
        
  select int_id,tint_level,tint_children,var_face,var_subject,datalength(txt_content) as int_len,sint_hits,var_url,var_image,var_user,dat_time,tint_tableid,bit_kernul from tab_discuss where tint_tableid=@tint_tableid and int_rootid between @int_pageend and @int_pagebegin order by int_rootid desc,num_order desc   --我们就可以利用该页的第一个id和最后一个id得出中间的id来。。。。(注意。我们这个BBS的数性结构用了一种很巧妙的算法,就是用一个orderNum浮点数即可完成排序。。。)

--开始清场。。。
  close cro_fastread     
  deallocate cro_fastread
  
  return

上一页  [1] [2] 


  • 打印文档
  • 推荐好友
  • 返回顶部
  • 增大字体
  • 减少字体
关于本站 | 工作机会 | 合作网站 | 广告服务 | 市场合作| 联系我们 | 抽奖活动
版权所有: 武汉威俊科技有限公司 Copyright 2005-2007 www.ITCNW.COM All rights reserved