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

使用Webdiyer(陕北吴旗娃)提供的分页控件中分页存储过程中出现的问题

楼主xyuncn(晓云)2005-07-09 13:05:56 在 .NET技术 / ASP.NET 提问

这个分页存储过程有时得不到正确的结果,  
  应该是SET   ROWCOUNT   @PageUpperBound影响到了函数dbo.f_GetFirstPy的内部。  
  例如如果@PageSize>=27,基本就没有问题了。  
  也就是说这个存储过程如果使用的函数中使用了select就可能出现问题。  
  该怎么消除set   rowcount对内部函数f_GetFirstPy的影响呢?  
  这个分页存储过程该如何修改?请高手指点。  
   
  分页的存储过程如下:  
  CREATE   PROC   sp_Mfr_GetByPage  
          @FirstName   varchar(1),  
          @PageSize   int   =   0,  
          @PageIndex   int   =   0,  
          @DoCount   bit   =   1,  
          @UserIDint    
  AS  
          SET   NOCOUNT   ON  
          IF   (   @DoCount   =   1   )    
          BEGIN  
                  IF   @FirstName   =   ''  
                          SELECT   COUNT(ID)   FROM   BIMS_Mfr   WHERE   Visible   =   1   AND   OperatorID   IN   (SELECT   *   FROM   f_Auth_User_GetJunior   (@UserID))  
                  ELSE  
                          SELECT   COUNT(ID)   FROM   BIMS_Mfr   WHERE   Visible   =   1   AND   OperatorID   IN   (SELECT   *   FROM   f_Auth_User_GetJunior   (@UserID))   AND   dbo.f_GetFirstPy(BossName)   =   @FirstName  
          END  
          ELSE  
          BEGIN  
                  DECLARE   @IndexTable   TABLE   (ID   int   IDENTITY(1,1),   NID   int)  
                  DECLARE   @PageLowerBound   int  
                  DECLARE   @PageUpperBound   int  
                  SET   @PageLowerBound=(@PageIndex-1)*@PageSize  
                  SET   @PageUpperBound=@PageLowerBound+@PageSize  
                  SET   ROWCOUNT   @PageUpperBound  
                  IF   @FirstName   =   ''  
                          INSERT   INTO   @IndexTable   (NID)   SELECT   [ID]   FROM   BIMS_Mfr   WHERE   Visible   =   1   AND   OperatorID   IN   (SELECT   *   FROM   f_Auth_User_GetJunior   (@UserID))   ORDER   BY     ShowOrder   ASC,ID   ASC  
                  ELSE  
                          INSERT   INTO   @IndexTable   (NID)   SELECT   [ID]   FROM   BIMS_Mfr   WHERE   Visible   =   1   AND   OperatorID   IN   (SELECT   *   FROM   f_Auth_User_GetJunior   (@UserID))   AND   dbo.f_GetFirstPy(BossName)   =   @FirstName   ORDER   BY   ShowOrder   ASC,ID   ASC  
                  SELECT   a.ID,   a.BossName,a.ShowOrder,(SELECT   RealName   FROM   BIMS_Auth_Staff   WHERE   UserID   =   a.OperatorID   )   AS   OperatorName,   a.OperatorID,   a.Name   FROM   BIMS_Mfr   a,   @IndexTable   b   WHERE   a.ID   =   b.NID    
                          AND   b.ID   >   @PageLowerBound   and   b.ID<=@PageUpperBound   ORDER   BY   b.ID    
          END  
          SET   NOCOUNT   OFF  
  GO  
   
  这其中用到了函数dbo.f_GetFirstPy提取BossName中文名的首字母  
  function   f_GetFirstPy(@str   varchar(50)='')  
          returns   char(1)  
  as  
  begin  
          declare   @n   int,   @c   char(1),   @chn   nchar(1)  
          select   @n=63,   @chn=substring(@str,1,1)  
          if   @chn   >   'z'  
                  select   @n   =   @n   +1  
                          ,@c   =   case   chn   when   @chn   then   char(@n)   else   @c   end  
                          from(  
                          select   top   27   *   from   (  
                                  select   chn   =   '吖'  
                                  union   all   select   '八'  
                                  union   all   select   '嚓'  
                                  union   all   select   '咑'  
                                  union   all   select   '妸'  
                                  union   all   select   '发'  
                                  union   all   select   '旮'  
                                  union   all   select   '铪'  
                                  union   all   select   '丌'   --because   have   no   'i'  
                                  union   all   select   '丌'  
                                  union   all   select   '咔'  
                                  union   all   select   '垃'  
                                  union   all   select   '嘸'  
                                  union   all   select   '拏'  
                                  union   all   select   '噢'  
                                  union   all   select   '妑'  
                                  union   all   select   '七'  
                                  union   all   select   '呥'  
                                  union   all   select   '仨'  
                                  union   all   select   '他'  
                                  union   all   select   '屲'   --no   'u'  
                                  union   all   select   '屲'   --no   'v'  
                                  union   all   select   '屲'  
                                  union   all   select   '夕'  
                                  union   all   select   '丫'  
                                  union   all   select   '帀'  
                                  union   all   select   @chn)   as   a  
                                  order   by   chn   COLLATE   Chinese_PRC_CI_AS    
                          )   as   b  
          else  
                  set   @c   =   ''  
          return   (@c)  
  end  
   
  问题点数:100、回复次数:22Top

1 楼postfix2(风间真)回复于 2005-07-09 13:23:35 得分 0

解铃还要系铃人。....................Top

2 楼lr2651(戎 The Two Towers)回复于 2005-07-09 13:29:24 得分 0

同意,问吴老大吧,给他发个消息Top

3 楼codeangel(http://www.wSoft.Net)回复于 2005-07-09 14:06:02 得分 0

没用过他的,不好意思Top

4 楼fancyf(凡瑞)回复于 2005-07-09 14:37:23 得分 0

分页存储过程写法很多,webdiyer.com上就提供了好几种分页存储过程,既然ROWCOUNT影响了里面其他的select语句,那么换一种不用ROWCOUNT的分页存储过程就行了Top

5 楼pwqzc(吴旗娃徒也~~老鼠粮仓之路)回复于 2005-07-09 17:05:33 得分 0

等下啊,你不要急,俺兄回老家趟  
  过几天他会给你很满意的回答的!!Top

6 楼xyuncn(晓云)回复于 2005-07-09 20:36:42 得分 0

这种比较简单了,另外有两种,其中一种也用到了set   rowcount,另外一种复杂了点。Top

7 楼zhilunchen(他山居士)回复于 2005-07-09 21:12:20 得分 0

老大,试试下面这个,其中@PageIndex是页索引号,如第一页就是0;@PageSize是页大小,就是页的记录条数,@Order是排序方式,''表示正序,'desc'表示逆序,当然这个存储可以传入表名改写为更通用的分页存储过程:  
  create   procedure   eosp_PagebdEmpInfo  
  (  
  @PageIndex   int,  
  @PageSize   int,  
  @Order   varchar(10)  
  )  
  as  
   
  declare   @PageLowerBound   int  
  declare   @PageUpperBound   int  
  set   @PageLowerBound   =   @PageSize   *   @PageIndex  
  set   @PageUpperBound   =   @PageLowerBound   +   @PageSize   +   1  
   
  create   table   #PageIndex  
  (  
  IndexId   int   identity   (1,   1)   not   null,  
  fEmpID   Int  
  )  
   
  if(@Order='')  
  begin  
  insert   into   #PageIndex   (fEmpID)  
  select   fEmpID   from   bdEmpInfos   order   by   fEmpID  
  end  
  else  
  begin  
  insert   into   #PageIndex   (fEmpID)  
  select   fEmpID   from   bdEmpInfos   order   by   fEmpID   desc  
  end  
   
  select   count(fEmpID)   from   bdEmpInfos  
   
  select   O.*  
  from   bdEmpInfos   O,#PageIndex   PageIndex  
  where   O.fEmpID   =   PageIndex.fEmpID   AND  
  PageIndex.IndexID   >   @PageLowerBound   AND  
  PageIndex.IndexID   <   @PageUpperBound  
  order   by   PageIndex.IndexID  
  GO  
  Top

8 楼xyuncn(晓云)回复于 2005-07-09 21:42:50 得分 0

select   count(fEmpID)   from   bdEmpInfos  
  每次都计算一下,对性能影响不小啊Top

9 楼xyuncn(晓云)回复于 2005-07-09 21:44:49 得分 0

还要把所有数据重插入临时表,这个对性能影响太大了。。。。。Top

10 楼zeusvenus()回复于 2005-07-09 22:07:58 得分 0

发论坛消息问问Webdiyer,他经常上CSDN的.Top

11 楼xyuncn(晓云)回复于 2005-07-10 10:18:43 得分 0

upTop

12 楼zhilunchen(他山居士)回复于 2005-07-10 12:50:44 得分 0

在服务器端执行,问题不大的,这个存储过程返回两个结果集,第一个表示记录总数,第二才是实际的页数据Top

13 楼xyuncn(晓云)回复于 2005-07-11 09:37:16 得分 0

再up一下Top

14 楼xyuncn(晓云)回复于 2005-07-12 09:01:18 得分 0

吴大哥呢  
  看来只能改分页方式了。Top

15 楼pwqzc(吴旗娃徒也~~老鼠粮仓之路)回复于 2005-07-13 08:28:04 得分 0

不好意思啊  
  我兄在老家休假几天  
  很快就会来回答你问题的啊  
  不要急啊Top

16 楼webdiyer(.net资源精华—www.dotneturls.com)回复于 2005-07-13 10:58:40 得分 100

我的那个存储过程中用set   rowcount是为了提高获取数据时的性能(不用每次都获取全部数据再填充临时表),如果它影响你的函数,你可以把它去掉试试,这个语句不影响存储过程的结果,只是性能。Top

17 楼xyuncn(晓云)回复于 2005-07-13 14:08:15 得分 0

ok,谢谢了  
  不过你设置了set   rowcount后,我感觉是不是应该set   rowcount   =   0?  
  Top

18 楼webdiyer(.net资源精华—www.dotneturls.com)回复于 2005-07-14 20:34:15 得分 0

不能set   rowcount   =   0,这样就一条记录也选不出来了Top

19 楼pwqzc(吴旗娃徒也~~老鼠粮仓之路)回复于 2005-07-18 09:09:15 得分 0

怎么还不结帐啊>Top

20 楼xyuncn(晓云)回复于 2005-08-05 17:46:18 得分 0

对于在远程表和本地及远程分区视图上执行的   INSERT、UPDATE   和   DELETE   语句,忽略   SET   ROWCOUNT   选项设置。  
   
  若要关闭该选项(以便返回所有的行),请将   SET   ROWCOUNT   指定为   0。  
  Top

21 楼xyuncn(晓云)回复于 2005-08-05 17:47:58 得分 0

我的意思是select后再set   rowcount=0  
  否则是不是可能影响其他的存储过程,或同一存储过程中的其他selectTop

22 楼RoninBlade(RoninBlade)回复于 2005-09-01 16:25:32 得分 0

markTop

相关问题

  • help:分页存储过程。。。。。。。。。
  • 求分页存储过程
  • 分页存储过程
  • 哪位帮我把下面陕北吴旗娃的SQL SERVER分页控件的存储过程改成ORACLE数据库能用的存储过程,谢谢!!!
  • 下面是陕北吴旗娃用SQL SERVER写的分页的存储过程,哪位有在ORACLE数据库上应用的实例,帮我将下面的存储过程改成ORACLE的存储过程。
  • 下面是陕北吴旗娃用SQL SERVER写的分页的存储过程,哪位有在ORACLE数据库上应用的实例,帮我将下面的存储过程改成ORACLE的存储过程。
  • 高分找分页的存储过程?
  • 老问题,存储过程分页
  • 分页存储过程~求解~
  • 分页存储过程请教

关键词

  • 存储过程
  • 函数
  • 分页
  • fempid
  • pageindex
  • pagelowerbound
  • chn
  • pageupperbound
  • getfirstpy
  • bdempinfos

得分解答快速导航

  • 帖主:xyuncn
  • webdiyer

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

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