sql 存储过程分页代码 支持亿万庞大数据量


  本文标签:存储过程,分页

复制代码 代码如下:

CREATE PROCEDURE page
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = *, -- 需要返回的列
@fldName varchar(255)=id, -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 0:asc 1:desc
@strWhere varchar(1500) = , -- 查询条件 (注意: 不要加 where)
@ID nvarchar(50)=id --主表的列 。 。最好是主键
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 + ( + @ID + ) 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 + (
+ @ID + ) from (select top + str((@PageIndex-1)*@PageSize) +
+ @fldName + from + @tblName + where + @strWhere +
+ @strOrder + ) as tblTmp) and + @strWhere + + @strOrder
end
end
exec (@strSQL)