欢迎光临
我们一直在努力

两个数据分页的存储过程_数据库技巧

建站超值云服务器,限时71元/月

1. 按某个特定表查询的存储过程:
CREATE PROCEDURE GetPagingData_bigfun
@tblName varchar(255), — 表名
@strGetFields varchar(1000) = *, — 需要返回的列
@fldName varchar(255)=, — 排序的字段名
@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 –如果@OrderType不是0,就执行降序,这句很重要!
  begin
  set @strTmp = <(select min
  set @strOrder = order by [ + @fldName +] desc 
  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代码 
   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
   else
    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
  end


 end
exec (@strSQL)
GO
2. 按提供的SQL语句进行的分页(使用了游标)
CREATE procedure p_splitpage
@sql nvarchar(4000),–要执行的sql语句
@page int=1, –要显示的页码
@pageSize int,–每页的大小
@pageCount int=0 out,–总页数
@recordCount int=0 out,–总记录数
@SearchTime int=0 out
as
declare @usetime datetime
set @usetime=getdate()
set nocount on
declare @p1 int
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
set @recordCount = @pageCount
select @pagecount=ceiling(1.0*@pagecount/@pagesize)
,@page=(@page-1)*@pagesize+1
exec sp_cursorfetch @p1,16,@page,@pagesize
exec sp_cursorclose @p1
set  @SearchTime=datediff(ms,@usetime,getdate())
print @SearchTime
GO


上述两个存储过程中,第一个使用特定的表,不利于多表的联合查询;后者由于使用了游标,执行的速度上不如前者.


http://www.cnblogs.com/bigfun4000/archive/2006/09/07/497553.html

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 两个数据分页的存储过程_数据库技巧
分享到: 更多 (0)