首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请批批小弟我修改的SqlServer2005的分页存储过程,有没漏洞

2012-01-21 
请各位高手批批我修改的SqlServer2005的分页存储过程,有没漏洞?/***分页存储过程***/ALTERProcedure[dbo].

请各位高手批批我修改的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

热点排行