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) |