Yuanhua's Blog

          My java blog
          posts - 1, comments - 0, trackbacks - 0, articles - 0

          2009年7月21日

          在網(wǎng)上搜到如下存儲(chǔ)過(guò)程分頁(yè)的代碼:

          create procedure splitpage @qry varchar(16384),@ipage int@num int as   
          begin 

                  
          declare @rcount int 
                  
          declare @execsql varchar(16384
                  
          select @rcount=@ipage*@num 
                  
          set rowcount @rcount 
                  
          set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),'
                  
          set @execsql = stuff(@execsqlcharindex('from',@execsql),5,'into #temptable1 from'
                  
          set @execsql = @execsql || ' select * from #temptable1  where sybid>' || convert(varchar,(@ipage-1)*@num|| ' and sybid <= ' || convert(varchar,@ipage*@num
                  
          execute (@execsql
                  
          set rowcount 0 
          end
          如果SQL比較復(fù)雜,如包含子查詢或使用union之類的SQL則會(huì)有問(wèn)題,為了在公司的項(xiàng)目中使用,做了如下修改:
          1.修改SQL,將select和from做標(biāo)記,替換成selects和froms
          create procedure splitpage @qry varchar(16384),@ipage int@num int as   
          begin 
                  
          declare @rcount int 
                  
          declare @execsql varchar(16384
                  
          select @rcount=@ipage*@num 
                  
          set rowcount @rcount 
                  
          set @execsql = str_replace(@qry,'selects','select sybid=identity(12),'
                  
          set @execsql = str_replace(@execsql'froms','into #temptable1 from'
                  
          set @execsql = @execsql || ' select * from #temptable1  where sybid>' || convert(varchar,(@ipage-1)*@num|| ' and sybid <= ' || convert(varchar,@ipage*@num
                  
          execute (@execsql
                  
          set rowcount 0 
          end
          2.在分頁(yè)組件中增加parseSQL方法,在執(zhí)行查詢前轉(zhuǎn)換SQL:
              public String parseProcSql(String sql){
                  String stemp 
          = sql.toUpperCase();
                  String v[] 
          = stemp.split("UNION");
                  String result 
          = "";
                  
          for(int i=0; i<v.length; i++){
                      
          int tmp = 0;
                      
          int from = 0;
                      tmp 
          = v[i].indexOf("SELECT",0);
                      
          if(tmp>0){
                          v[i] 
          = v[i].substring(0,tmp) + "SELECTS" + v[i].substring(tmp+6);
                      }
          else{
                          v[i] 
          = "SELECTS" + v[i].substring(6);
                      }
                      
                      
          if(i==0){
                          
          while(tmp!=-1){
                              from 
          = v[i].indexOf("FROM",from+1);
                              tmp 
          = v[i].indexOf("SELECT",tmp+1);
                              
          if(tmp>from)break;
                          }
                          result 
          = v[i].substring(0,from) + "FROMS" + v[i].substring(from+4);
                      }
          else{
                          result 
          = result + "UNION" + v[i];
                      }
                  }
                  
          return result;
              }
          3.使用union all分頁(yè)仍然會(huì)有問(wèn)題.

          posted @ 2009-07-21 13:48 Yuanhua 閱讀(500) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 奇台县| 吉木萨尔县| 张家界市| 安丘市| 新宁县| 衡阳市| 克东县| 岳普湖县| 河北省| 上栗县| 绥宁县| 华宁县| 都兰县| 常山县| 佛冈县| 贵定县| 尖扎县| 彰化县| 新竹市| 科技| 大名县| 云南省| 宣威市| 潮安县| 休宁县| 方正县| 黔西县| 株洲县| 敖汉旗| 司法| 正宁县| 通州市| 砚山县| 阿拉善左旗| 庄河市| 宜宾市| 微博| 大厂| 轮台县| 鄂托克前旗| 万山特区|