您的位置:首页 > 其它

支持任意排序的分页存储过程

2008-10-23 13:07 507 查看
从网上找了一个分页存储过程,在使用的过程中出现对非主键排序查询时,查不到数据,根据sql2005

的特点修改了其bug,已经添加性能测试(2008-10-27)。

存储过程

IF OBJECT_ID(N'[dbo].[pro_GetRecordByPageOrder1]') IS NOT NULL

DROP PROCEDURE [dbo].[pro_GetRecordByPageOrder1]

go

------------------------------------

--用途:支持任意排序的分页存储过程

--说明:

------------------------------------

create PROCEDURE pro_GetRecordByPageOrder1

(

@tblName varchar(255), -- 表名

@fldName varchar(255)='*', -- 显示字段名

@OrderfldName varchar(255), -- 排序字段名

@PageSize int = 10, -- 页尺寸

@PageIndex int = 1, -- 页码

@IsReCount bit = 0, -- 返回记录总数, 非 0 值则返回

@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)

)

--with encryption

AS

begin

declare @strSQL varchar(6000) -- 主语句

declare @strSQL1 varchar(2000) -- 主语句

declare @strTmp varchar(100) -- 临时变量

declare @strOrder varchar(400) -- 排序类型

set @strTmp = ' where rownum >'+str((@PageIndex-1)*@PageSize)

if @OrderType != 0

begin

set @strOrder = ' order by [' + @OrderfldName +'] desc'

end

else

begin

set @strOrder = ' order by [' + @OrderfldName +'] asc'

end

set @strSQL =' select top ' + str(@PageIndex*@PageSize)

+ ' *, ROW_NUMBER() OVER('+@strOrder+') AS rownum from [' + @tblName + '] ' ;

if @strWhere != ''

set @strSQL = @strSQL+ ' where '+ @strWhere ;

if @PageIndex = 1

begin

set @strSQL =' select top ' + str(@PageSize) + ' ' + @fldName

+ ' from '+@tblName +' '

if @strWhere != ''

set @strSQL = @strSQL + ' where '+@strWhere +' '+@strOrder

else

set @strSQL = @strSQL +' '+@strOrder

end

else

begin

set @strSQL =' select ' + @fldName + ' from ( '+@strSQL+' ) as tmp1 '+@strTmp;

end

if @IsReCount != 0

begin

set @strSQL = @strSQL+' select count(1) as Total from ['+@tblName +'] '

if @strWhere != ''

set @strSQL = @strSQL+' where '+@strWhere

end

print @strsql

exec( @strSQL)

end

go

--endregion

关于存储过程的性能(这个主要看你对查询的索引建立是否合理):





有回复说在字段值完全相同的情况下,要出错的问题,我已经作了测试,是完全能正常执行的(2008-12-09)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐