CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

这个通用查询分页存储过程错在那里。

楼主susan0603()2005-08-17 22:54:01 在 MS-SQL Server / 基础类 提问

下面是在网上找到的一个通用查询分页存储过程,但在查询分析器中运行时出错,小弟对存储过程不太熟,那位仁兄能帮小弟改好呀。  
  CREATE   PROCEDURE   pagination3  
  @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      
   
  else  
  begin  
  if   @OrderType   !=   0  
  begin  
          set   @strTmp   =   "<(select   min"  
  set   @strOrder   =   "   order   by   ["   +   @fldName   +"]   desc"  
  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  
  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    
   
  end        
   
  exec   (@strSQL) 问题点数:80、回复次数:7Top

1 楼susan0603()回复于 2005-08-17 22:55:37 得分 0

出错提示如下:  
  服务器:   消息   207,级别   16,状态   3,过程   pagination3,行   35  
  列名   'select   count(*)   as   Total   from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   35  
  列名   ']   where   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   39  
  列名   'select   count(*)   as   Total   from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   39  
  列名   ']'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   55  
  列名   '<(select   min'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   57  
  列名   '   order   by   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   57  
  列名   ']   desc'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   67  
  列名   '>(select   max'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   69  
  列名   '   order   by   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   69  
  列名   ']   asc'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   81  
  列名   'select   top   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   81  
  列名   '   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   81  
  列名   '     from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   81  
  列名   ']   where   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   81  
  列名   '   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   85  
  列名   'select   top   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   85  
  列名   '   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   85  
  列名   '     from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   85  
  列名   ']   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   'select   top   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   '   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   '     from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   ']   where   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   ']'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   '(['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   '])   from   (select   top   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   '   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   ']   from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   ']'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   97  
  列名   ')   as   tblTmp)'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   'select   top   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   '   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   '     from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   ']   where   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   ']'   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   '(['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   '])   from   (select   top   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   '   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   ']   from   ['   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   ']   where   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   '   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   ')   as   tblTmp)   and   '   无效。  
  服务器:   消息   207,级别   16,状态   1,过程   pagination3,行   105  
  列名   '   '   无效。Top

2 楼vivianfdlpw()回复于 2005-08-17 23:06:25 得分 70

双引号"""全部换成单引号"'"  
   
  CREATE   PROCEDURE   pagination3  
  @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      
   
  else  
  begin  
  if   @OrderType   !=   0  
  begin  
          set   @strTmp   =   '<(select   min'  
  set   @strOrder   =   '   order   by   ['   +   @fldName   +']   desc'  
  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  
  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    
   
  end        
   
  exec   (@strSQL)  
  Top

3 楼susan0603()回复于 2005-08-17 23:45:24 得分 0

没错了,谢谢!  
  另外,能不能再帮我改一下  
  我用的是SELECT语句是这样的:  
  SELECT   T.*,   Y.*   FROM   Table1   T   INNER   JOIN     Table2   Y   ON   T.ID   =   Y.ID  
  在这个存储过程中应该怎样改呢Top

4 楼renfeiyang(任飞扬)回复于 2005-08-18 00:00:31 得分 0

vivianfdlpw的例子很好用,收藏了Top

5 楼xingfuzhang(麦莎1号)回复于 2005-08-19 14:25:31 得分 0

eTop

6 楼wgsasd311(自强不息)回复于 2005-08-19 15:15:37 得分 10

我用的是SELECT语句是这样的:  
  SELECT   T.*,   Y.*   FROM   Table1   T   INNER   JOIN     Table2   Y   ON   T.ID   =   Y.ID  
  在这个存储过程中应该怎样改呢  
  --------------------把上面SQL语句建成一个视图,然后表名时用此视图名(tba)替代即可。  
  create   view   tba   as    
  SELECT   T.*,   Y.*   FROM   Table1   T   INNER   JOIN     Table2   Y   ON   T.ID   =   Y.ID  
  Top

7 楼susan0603()回复于 2005-08-20 11:18:16 得分 0

我是想不用视图,能不能直接在这个存储过程中实现呢Top

相关问题

  • 用存储过程分页查询还是好慢,在查询分析器执行存储过程要10秒
  • 大家看看这两种通用分页存储过程哪个更好啊???
  • help:分页存储过程。。。。。。。。。
  • 求分页存储过程
  • 分页存储过程
  • 帮我看看这段分页模糊查询的存储过程?
  • 以前老大写的一个通用分页的存储过程,有点问题
  • 百万记录快速查询分页存储过程问题(where 条件太长,导至查询出错)
  • 高分找分页的存储过程?
  • 老问题,存储过程分页

关键词

  • 服务器
  • 消息
  • 查询
  • 存储过程
  • 排序
  • top
  • 无效
  • 级别16
  • 状态1
  • 过程pagination3

得分解答快速导航

  • 帖主:susan0603
  • vivianfdlpw
  • wgsasd311

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo