首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

啊 头都搞晕了

2012-01-19 
求助啊 头都搞晕了执行一个分页存储过程CREATEPROCEDURE[dbo].[CommonPager]@tblNamevarchar(255),--表名@

求助啊 头都搞晕了
执行一个分页存储过程
CREATE   PROCEDURE   [dbo].[CommonPager]
@tblName       varchar(255),               --   表名
@strGetFields   varchar(1000)   =   '* ',     --   需要返回的列  
@fldName   varchar(255)= ' ',             --   排序的字段名
@PageSize       int   =   10,                     --   页尺寸
@PageIndex     int   =   1,                       --   页码
@doCount     bit   =   0,       --   返回记录总数,   非   0   值则返回
@OrderType   bit   =   0,     --   设置排序类型,   非   0   值则降序
@strWhere     varchar(1500)   =   ' '     --   查询条件   (注意:   不要加   where)
AS
declare   @strSQL       varchar(5000)               --   主语句
declare   @strTmp       varchar(110)                 --   临时变量
declare   @strOrder   varchar(400)                 --   排序类型
 
if   @doCount   !=   0
    begin
        if   @strWhere   != ' '
        set   @strSQL   =   'select   count(*)   as   Total   from   '   +   @tblName   +   '   where   '+@strWhere
        else
        set   @strSQL   =   'select   count(*)   as   Total   from   '   +   @tblName  
end    
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

exec   (@strSQL)  
if   @OrderType   !=   0
begin
        set   @strTmp   =   ' <(select   min '
set   @strOrder   =   '   order   by   '   +   @fldName   + '   desc '
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
        set   @strTmp   =   '> (select   max '
        set   @strOrder   =   '   order   by   '   +   @fldName   + '   asc '
end
 
if   @PageIndex   =   1
begin
        if   @strWhere   !=   ' '      
        set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   '   +   @tblName   +   '   where   '   +   @strWhere   +   '   '   +   @strOrder
          else
          set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   '+   @tblName   +   @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   '


        +   @tblName   +   '   where   '   +   @fldName   +   @strTmp   + '( '+   @fldName   +   ')   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   @fldName   +   '   from   '   +   @tblName   +     @strOrder   +   ')   as   tblTmp) '+   @strOrder
 
if   @strWhere   !=   ' '
        set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   '
                +   @tblName   +   '   where   '   +   @fldName     +   @strTmp   +   '( '
                +   @fldName   +   ')   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)  
                +   @fldName   +   '   from   '   +   @tblName   +   '   where   '   +   @strWhere   +   '   '
                +   @strOrder   +   ')   as   tblTmp)   and   '   +   @strWhere   +   '   '   +   @strOrder
end  
exec   (@strSQL)
GO

执行这个的时候
EXEC   commonpager   'employees ',   '* ',   'EmplSeril ',   10,   2,   1,   0,   ' '就出现top子句中的行数必须为整数的错误,不知道为什么   这个存储过程对我系统其他的表都没问题就是对这个 'employees '表,到第二页就有问题   真是搞不清为什么,高手帮帮我啊!谢谢!!!

[解决办法]
通过事件探查器跟踪下 @strSQL 最终值,分析下哪个参数有问题,导致构造的动态 sql 语句有问题

重点检查 TOP 关键字后面的参数 @PageSize 是否为空?

或者直接输出 @strSql

> > >

end
--exec (@strSQL)
PRINT @strSQL

然后执行,查看输出 sql

EXEC commonpager 'employees ', '* ', 'EmplSeril ', 10, 2, 1, 0, ' '

热点排行