请各位高手批批我修改的SqlServer2005的分页存储过程,有没漏洞?
/*** 分页存储过程 ***/
ALTER Procedure [dbo].[SP_ExecPager]
(
@TblName varchar(255), -- 表名及表集合
@Fields varchar(1000)= '* ' , -- 列名及字段集合
@SortKey varchar(255)= 'Id ' , -- 排序的字段名
@SortType varchar(50)= 'ASC ' , -- 排序类型
@Orders varchar(2000)= ' ' , -- 排序条件 (不要加 order by)
@Wheres varchar(2000)= ' ' , -- 查询条件 (不要加 where)
@PageSize int= 10 , -- 页长
@PageIndex int = 1 , -- 当前页
@FldCount int output -- 记录总数
)
AS Begin
declare @strSql varchar(3600) --- 声明临时sql语句变量
declare @MyTable varchar(3600) --- 引用表
-- 设置查询条件 --
If @Wheres != ' ' begin
set @Wheres = ' where '+@Wheres
end
-- 设置排序条件 --
if @Orders != ' ' begin
set @Orders = ' order by ' + @Orders
end
-- 设置当前页的记录数 --
declare @CurrFields varchar(10)
Set @CurrFields = cast((@PageSize*@PageIndex) as varchar(50))
-- 上一页的记录数 --
declare @PrevFields varchar(10)
set @PrevFields = cast(((@PageIndex-1)*@PageSize) as varchar(50))
-- 设置页长的引用 --
declare @PSize varchar(10)
Set @PSize = cast(@PageSize as varchar(50))
/************* < < < 第1页 > > > 直接返回信息以及总记录数 ************/
IF @PageIndex = 1 Begin
-- 1 执行一个返回总记录数的存储过程,获取该条件下的记录总数
exec SP_GetFieldCount @TblName,@Orders,@Wheres,@FldCount output
-- 2 直接输出第一页记录
set @strSql = 'select top ' +@PSize+ ' ' + @Fields + ' from ' +@TblName+ ' ' + @Wheres + ' ' + @Orders
exec(@strSql)
return
End
/************* < < < 第2页以后 > > > 可能有问题 ?? ************/
Else Begin
Set @MyTable= '(SELECT Top '+@CurrFields+ ' ROW_NUMBER() OVER(ORDER BY '+@SortKey+ ' '+@SortType+ ')AS RowId , ' + @Fields
+ ' FROM '+@TblName + ' ' + @Wheres+ ' ' + @Orders
+ ')AS MyTable '
set @strSql= 'SELECT TOP '+@PSize+ ' * FROM ' +@MyTable+ ' WHERE RowId > '+ @PrevFields
exec(@strSql)
return
End
-- //结束 ---
End
------------------------------------
希望各位存储过程高手给看看,我测试过,没问题,但是心里总觉得还有不完善的地方,所以贴出来给大家批批,希望能找出漏洞...
[解决办法]
ROW_NUMBER