zoukankan      html  css  js  c++  java
  • 转:超级通用型分页存储过程

    -- 超级通用型分页存储过程
    --          可对Select 语句进行分页,可带 order 、group 等子句
    --          KeyField (关键词) 可以为空,也可以由多个,用,间隔
    --          使用Keyfield 可以进行缓冲更新模式
    --          Dcopyboy 义乌科创计算机有限公司 软件部
    --          2012-01-08
    ----------
    CREATE proc GetData
    @SQLSTR varchar(8000),
    @KeyField varchar(500),
    @PageNo int,
    @PageSize int
    as
    begin
     DECLARE @pos int,@SQLSTR1 varchar(8000),@SQLSTR2 varchar(50)
     set @SQLSTR = Rtrim(Ltrim(@SQLSTR))
     if lower(SUBSTRING (@SQLSTR, 1, 6)) = 'select' 
     begin
     set @SQLSTR =Rtrim(Ltrim(SUBSTRING(@SQLSTR, 7, 8000)))
     if SUBSTRING(@SQLSTR, 1, 8) = 'distinct' begin
      set @SQLSTR =Rtrim(Ltrim(SUBSTRING(@SQLSTR, 9, 8000)))
      if SUBSTRING(@SQLSTR, 1, 4) <> 'top ' 
      begin
      set @SQLSTR = 'select distinct top 10000000 ' + @SQLSTR
      end
      else begin
       set @SQLSTR = 'select distinct ' + @SQLSTR
      end
     end
     else begin  
      if SUBSTRING(@SQLSTR, 1, 4) <> 'top ' 
       begin
       set @SQLSTR = 'select top 10000000 ' + @SQLSTR
       end
       else begin
       set @SQLSTR = 'select ' + @SQLSTR
       end
      end
    if @keyField<>'' 
    begin 
    DECLARE @KeyField1 varchar(500),@field varchar(50),@Cxtj varchar(2000),@Fields varchar(1000)
    set @KeyField1=rtrim(ltrim(@KeyField)) 
    set @Cxtj=''
    set @Fields=''
     set @pos=CHARINDEX (',',@KeyField1)
     while @pos>0 begin
     set @field=left(@KeyField1,@pos-1)
     set @KeyField1=rtrim(ltrim(right(@KeyField1,len(@KeyField1)-@pos)))
     set @pos=CHARINDEX ('.',@field)
     if @pos>0 begin
       set @Cxtj=@Cxtj+'#temp1.'+right(@field,len(@field)-@pos)+'='+@field+' and '
       set @Fields=@Fields+right(@field,len(@field)-@pos)+','
     end
     else begin
       set @Cxtj=@Cxtj+'#temp1.'+@field+'='+@field+' and '
       set @Fields=@Fields+@field+','
     end
      set @pos=CHARINDEX (',',@KeyField1)
     end
    if @KeyField1<>''
    begin
     set @pos=CHARINDEX ('.',@KeyField1)
     if @pos>0 begin
       set @Cxtj=@Cxtj+'#temp1.'+right(@KeyField1,len(@KeyField1)-@pos)+'='+@KeyField1+' and '
       set @Fields=@Fields+right(@KeyField1,len(@KeyField1)-@pos)+','
     end
     else begin
       set @Cxtj=@Cxtj+'#temp1.'+@KeyField1+'='+@KeyField1+' and '
       set @Fields=@Fields+@KeyField1+','
      end
    end

    if Right( @Cxtj,4)='and ' 
    set @Cxtj=left(@Cxtj,len(@Cxtj)-4)
     set @pos=CHARINDEX ('where',LOWER(@SQLSTR))
     If @pos>0 begin
       set @pos=@pos+4
       set @SQLSTR1=left(@SQLSTR,@pos)+' EXISTS (select * from #temp1 where rowNumber between @t+1 and @t+@PageSize and '+@Cxtj+') and '+right(@SQLSTR,len
    (@SQLSTR)-@pos)
       set @SQLSTR2= ' SELECT '+@Fields
     end
     else RAISERROR ('带关键字段的分页查询必须带where子句!', 16, 1)
    end
    else begin
     set @SQLSTR1=' select * from #temp1 where rowNumber between @t+1 and @t+@PageSize order by rowNumber '
     set @SQLSTR2=' SELECT T1.*,'
    end
    set @SQLSTR= 'declare @PageSize int,@pageno int '+
     ' declare @RecordCount int,@t int '+
     ' Set @PageSize='+convert(varchar(10),@PageSize)+
     ' set @pageno='+convert(varchar(10),@pageno)+ 
     @SQLSTR2+'IDENTITY(INT,1,1) AS rowNumber INTO #temp1 FROM ('+@SQLSTR+') AS T1 left JOIN (select 1 as a) AS T2 ON 1=2'+
     ' select @RecordCount= @@rowcount '+
     ' if @pageno<1 select @pageno=1 ' +
     ' select @T=(@PageNo-1)*@PageSize ' +
     ' if @T>=@RecordCount set @T=@T-@RecordCount '+@SQLSTR1+
     ' drop table #temp1 '+
     ' select @RecordCount as 记录数 '
     exec(@SQLSTR) 
    end
    else RAISERROR ('只适合Select带头的语句', 16, 1)
    end
    GO

      下次将发表可以使用Parameters 的参数 超级通用型分页DELPHI 函数(过程),欢迎大家多提意见。


      义乌科创计算机有限公司软件部
       Dcopyboy
       Email:dcopyboy@tom.com
       QQ:445235526

  • 相关阅读:
    影响Java EE性能的十大问题
    Android APK加壳技术方案【2】
    动态实时跟踪你的java程序
    ASP.NET MVC载入页面常用方法
    JavaWeb禁用浏览器缓存
    JavaWebresponse两个流
    nslookup命令用法
    GDAL交流 QQ群
    事件(二)——Jquery事件模型
    浅谈meta标签
  • 原文地址:https://www.cnblogs.com/leonkin/p/2363616.html
Copyright © 2011-2022 走看看