设为首页   |  加入收藏夹 快速导航:  热门文章  |  最新文章  |  梦想博客  
当前位置:编程之家 -> 文章频道 ->SQLSERVER 
站内搜索:  

通用高效的分页存储过程

作者:佚名 来源:不详 整理日期:2008-06-23
原来使用的存储过程是基于临时表的。效率比较低。在网上搜索到一个通用的存储过程。为了保证原来的项目不修改,通过对原来的存储过程修改而成。效率大大提高!哈哈

有个不好的地方就是不能处理多个表。可以通过视图来解决。
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