通用高效的分页存储过程

Posted by yuno 21 June,2007 (0)Comment
原来使用的存储过程是基于临时表的。效率比较低。在网上搜索到一个通用的存储过程。为了保证原来的项目不修改,通过对原来的存储过程修改而成。效率大大提高!哈哈

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

Related Items

Categories : 技术 Tags : 存储过程  
Comments
Leave a comment

Or, take a look at Archives and Categories

Category

Archives