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

  • 相关阅读:
    LeetCode 1275. 找出井字棋的获胜者 Find Winner on a Tic Tac Toe Game
    LeetCode 307. 区域和检索
    LeetCode 1271 十六进制魔术数字 Hexspeak
    秋实大哥与花 线段树模板
    AcWing 835. Trie字符串统计
    Leetcode 216. 组合总和 III
    Mybatis 示例之 复杂(complex)属性(property)
    Mybatis 示例之 复杂(complex)属性(property)
    Mybatis 高级结果映射 ResultMap Association Collection
    Mybatis 高级结果映射 ResultMap Association Collection
  • 原文地址:https://www.cnblogs.com/leonkin/p/2363616.html
Copyright © 2011-2022 走看看