Yuanhua's Blog

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

          2009年7月21日

          在網上搜到如下存儲過程分頁的代碼:

          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比較復雜,如包含子查詢或使用union之類的SQL則會有問題,為了在公司的項目中使用,做了如下修改:
          1.修改SQL,將select和from做標記,替換成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.在分頁組件中增加parseSQL方法,在執行查詢前轉換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分頁仍然會有問題.

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

          主站蜘蛛池模板: 西充县| 肇州县| 启东市| 师宗县| 黔西县| 濮阳县| 镇赉县| 大田县| 通山县| 合水县| 城步| 老河口市| 南投县| 论坛| 新民市| 富阳市| 凤台县| 山阴县| 鄂尔多斯市| 张家口市| 仪征市| 台南市| 秀山| 宣汉县| 临海市| 五家渠市| 洛南县| 栖霞市| 阿拉善右旗| 库伦旗| 游戏| 台山市| 汪清县| 息烽县| 闸北区| 汶上县| 渝北区| 阿克陶县| 无锡市| 新兴县| 科技|