zoukankan      html  css  js  c++  java
  • 分页存储过程

    CREATE procedure [dbo].[Prc_splitpage]
        @sql nvarchar(4000),
     @idField nvarchar(100), 
        @page int=1, 
        @pageSize int,
        @pageCount int=0 out,
        @recordCount int=0 out,
     @where nvarchar(4000), 
     @order nvarchar(4000) 
    as
     declare @sqlLen int 
     declare @sqlWhereIndex int 
     declare @sqlWhere nvarchar(4000)
     declare @sqlOrderIndex int 
     declare @sqlOrder nvarchar(4000)
     declare @sqlBracketIndex int 
     declare @sqlFromIndex int 
     declare @leftBracketNumber int 
     declare @rightBracketNumber int 

        set @sqlWhere=''
        set @sqlOrder=''
        set @sqlWhereIndex=-1
        set @sqlOrderIndex=-1
        set @sqlFromIndex=-1
       
     select @sql=LOWER(@sql)
        select @sqlLen=len(@sql)
     
     while (charindex(' order by ',@sql,@sqlOrderIndex+1)>0)     
       begin  
      set @sqlOrderIndex=charindex(' order by ',@sql,@sqlOrderIndex+1)  
       end   
        set @sqlBracketIndex=@sqlOrderIndex
        set @leftBracketNumber=0
        set @rightBracketNumber=0
     while (charindex('(',@sql,@sqlBracketIndex+1)>0)    
       begin  
            set @leftBracketNumber=@leftBracketNumber+1
      set @sqlBracketIndex=charindex('(',@sql,@sqlBracketIndex+1)  
       end
        set @sqlBracketIndex=@sqlOrderIndex
     while (charindex(')',@sql,@sqlBracketIndex+1)>0)    
       begin  
            set @rightBracketNumber=@rightBracketNumber+1
      set @sqlBracketIndex=charindex(')',@sql,@sqlBracketIndex+1)  
       end
        if(@leftBracketNumber!=@rightBracketNumber) set @sqlOrderIndex=-1
        if(@sqlOrderIndex>0)
          begin
            select @sqlOrder=substring(@sql,@sqlOrderIndex,@sqlLen)
            select @sql=substring(@sql,0,@sqlOrderIndex)
          end
        else
          begin
            set @sqlOrder=@order
          end     
        
     while (charindex(' where ',@sql,@sqlWhereIndex+1)>0)    
       begin  
      set @sqlWhereIndex=charindex(' where ',@sql,@sqlWhereIndex+1)  
       end   
        set @sqlBracketIndex=@sqlWhereIndex
        set @leftBracketNumber=0
        set @rightBracketNumber=0
     while (charindex('(',@sql,@sqlBracketIndex+1)>0)    
       begin  
            set @leftBracketNumber=@leftBracketNumber+1
      set @sqlBracketIndex=charindex('(',@sql,@sqlBracketIndex+1)  
       end
        set @sqlBracketIndex=@sqlWhereIndex
     while (charindex(')',@sql,@sqlBracketIndex+1)>0)    
       begin  
            set @rightBracketNumber=@rightBracketNumber+1
      set @sqlBracketIndex=charindex(')',@sql,@sqlBracketIndex+1)  
       end
        if(@leftBracketNumber!=@rightBracketNumber) set @sqlWhereIndex=-1
        if(@sqlWhereIndex>0)
          begin
            select @sqlWhere=substring(@sql,@sqlWhereIndex,@sqlLen)
            select @sql=substring(@sql,0,@sqlWhereIndex)
            if(len(isnull(@where,'')) >0)
              begin
                select @sqlWhere=@sqlWhere+' and '+@where
              end
          end
        else
          begin
            if(len(isnull(@where,'')) >0)select @sqlWhere=' where '+@where
          end
     
     while (charindex(' from',@sql,@sqlFromIndex+1)>0)    
       begin  
      set @sqlFromIndex=charindex(' from',@sql,@sqlFromIndex+1)  
       end 
        set @sqlBracketIndex=@sqlFromIndex
        set @leftBracketNumber=0
        set @rightBracketNumber=0
     while (charindex('(',@sql,@sqlBracketIndex+1)>0)    
       begin  
            set @leftBracketNumber=@leftBracketNumber+1
      set @sqlBracketIndex=charindex('(',@sql,@sqlBracketIndex+1)  
       end
        set @sqlBracketIndex=@sqlFromIndex
     while (charindex(')',@sql,@sqlBracketIndex+1)>0)    
       begin  
            set @rightBracketNumber=@rightBracketNumber+1
      set @sqlBracketIndex=charindex(')',@sql,@sqlBracketIndex+1)  
       end
        if(@leftBracketNumber!=@rightBracketNumber) set @sqlFromIndex=-1 
       
        if(@idField is not null and len(@idField)>0)
           begin
            declare @fromSql nvarchar(4000)
            declare @totalSql nvarchar(4000)
      declare @totalnum int
            if(@sqlOrder is null or len(@sqlOrder)=0) select @sqlOrder=' order by '+@idField
            select @fromSql=substring(@sql,@sqlFromIndex,@sqlLen)
            select @totalSql='select @totalnum=count(1) '+@fromSql+@sqlWhere
      exec sp_executesql @totalSql,N'@totalnum int output',@totalnum output 
     
            set @pageCount=@totalnum
      set @recordCount = @pageCount
      select @pagecount=ceiling(1.0*@pagecount/@pagesize),@page=(@page-1)*@pagesize+1
     
      select @sql='select A.*,B.rowNum from ('+@sql+@sqlWhere+') A,(select ROW_NUMBER() Over('+@sqlOrder+') as rowNum, '+@idField+@fromSql+@sqlWhere+') B where B.rowNum>='+cast(@page as varchar)+' and B.rowNum<'+cast((@page+@pagesize) as varchar)+' and B.'+@idField+'=A.'+@idField+' order by B.rowNum'

      set nocount on

      --使用游标
      declare @p3 int
      exec sp_cursoropen @p3 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
      exec sp_cursorfetch @p3,16,1,@pagesize
      exec sp_cursorclose @p3
           end
        else
           begin
      select @sql=@sql+@sqlWhere+@sqlOrder 

      set nocount on
      declare @p1 int
      exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
      set @recordCount = @pageCount
      select @pagecount=ceiling(1.0*@pagecount/@pagesize),@page=(@page-1)*@pagesize+1
      exec sp_cursorfetch @p1,16,@page,@pagesize
      exec sp_cursorclose @p1
           end

    调用:

    DECLARE 
                                 @pageCount int,
                                 @recordCount int

                            EXEC [Prc_splitpage]
                                 @sql = N'select a.* from glunimportreceivablelistsubps(2,1,''Y'',''01/01/2011'',''10/31/2011'')a ',
                                    @idField = 'mainid',
                                 @page = 1,
                                 @pageSize = 20,
                                 @pageCount = @pageCount OUTPUT,
                                 @recordCount = @recordCount OUTPUT,
                                 @where = N'',
                                 @order = N''

                            SELECT @recordCount as N'@recordCount'

  • 相关阅读:
    SQL结构化查询语言
    数据库主外键
    SQL数据库数据类型详解
    注释和特殊符号
    文本装饰
    列表样式
    网页背景
    SQL数据库数据类型详解
    数据库主外键
    Update 语句
  • 原文地址:https://www.cnblogs.com/ldqwyl/p/2015130.html
Copyright © 2011-2022 走看看