
通用高效的分页存储过程 |
原来使用的存储过程是基于临时表的。效率比较低。在网上搜索到一个通用的存储过程。为了保证原来的项目不修改,通过对原来的存储过程修改而成。效率大大提高!哈哈 有个不好的地方就是不能处理多个表。可以通过视图来解决。 Create PROCEDURE sp_pagination ( @fields NVARCHAR( 1000 ), --字段名 @tables NVARCHAR( 400 ), ---表名 @filters NVARCHAR( 400 ), --筛选条件 @sortfields NVARCHAR( 50 ), --排序字段 @sorttype NVARCHAR( 4 ), --排序类型 @currentpage INT, --当前页 @PageSize INT, --页尺寸 @total INT OUTPUT --返回记录总数 ) AS declare @strSQL nvarchar(1000) -- 主语句 declare @strTmp nvarchar(300) -- 临时变量 declare @strOrder nvarchar(400) -- 排序类型 if @sorttype = desc begin set @strTmp = <(select min set @strOrder = order by [ + @sortfields +] desc end else begin set @strTmp = >(select max set @strOrder = order by [ + @sortfields +] asc end set @strSQL = select top + str(@PageSize) + * from [ + @tables + ] where [ + @sortfields + ] + @strTmp + ([ + @sortfields + ]) from (select top + str((@currentpage-1)*@PageSize) + [ + @sortfields + ] from [ + @tables + ] + @strOrder + ) as tblTmp) + @strOrder if @filters != set @strSQL = select top + str(@PageSize) + * from [ + @tables + ] where [ + @sortfields + ] + @strTmp + ([ + @sortfields + ]) from (select top + str((@currentpage-1)*@PageSize) + [ + @sortfields + ] from [ + @tables + ] where + @filters + + @strOrder + ) as tblTmp) and ( + @filters + ) + @strOrder if @currentpage = 1 begin set @strTmp = if @filters != set @strTmp = where + @filters + set @strSQL = select top + str(@PageSize) + * from [ + @tables + ] + @strTmp + + @strOrder end EXECUTE( @strSQL ) set @strSQL = select @total=count(*) from + @tables + set @strSQL = @strSQL + where + @filters + EXEC SP_EXECUTESQL @strSQL,N@total INT OUTPUT, @total OUTPUT GO |