• 数据库分页存储过程


    表名:可以为多表联合查询后作为一个新的表名来使用

    表名也可以为视图名(不推荐)

    表名可以是多个表,连接条件写在where中,用where代替on

    MySQL

    CREATE PROCEDURE Common_GetPagedList
    (
    p_cloumns varchar(500),
    p_tables varchar(100),
    p_where varchar(4000),
    p_order varchar(100),
    p_pageindex int,
    p_pagesize int,
    out p_recordcount int,
    out p_pagecount int
    
    )
    begin
    declare v_sqlcounts varchar(4000);
    declare v_sqlselect varchar(4000);
    
    if(p_cloumns is null or p_cloumns='') then set p_cloumns = ' * '; end if;
    if(p_where is null or p_where='') then set p_where = ' 1=1 '; end if;
    if(p_order is null or p_order='') then set p_order = ' Id desc '; end if;
    
    #拼接查询总记录的SQL语句
    set v_sqlcounts = concat('select count(1) into @recordcount from ',p_tables,' where ',p_where);
    #select v_sqlcounts;leave $$;
    set @sqlcounts = v_sqlcounts;
    prepare stmt from @sqlcounts;
    execute stmt;
    deallocate prepare stmt;
    #获取动态SQL语句返回值
    set p_recordcount = @recordcount;
    #根据总记录跳数计算出总页数
    set p_pagecount = ceiling((p_recordcount+0.0)/p_pagesize);
    if p_pageindex <1 then
    set p_pageindex = 1;
    elseif p_pageindex > p_pagecount and p_pagecount <> 0 then
    set p_pageindex = p_pagecount;
    end if;
    #拼接分页查询记录的动态SQL语句
    set v_sqlselect = concat('select ',p_cloumns,' from ',p_tables,' where ',p_where,' order by ',p_order,' limit ',(p_pageindex-1)*p_pagesize,' , ',p_pagesize);
    select v_sqlselect;
    set @sqlselect = v_sqlselect;
    prepare stmtselect from @sqlselect;
    execute stmtselect;
    deallocate prepare stmtselect;
    end

     SQL分页

    USE [CRM]
    GO
    
    /****** Object:  StoredProcedure [dbo].[Common_GetPagedList]    Script Date: 07/17/2016 21:54:41 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [dbo].[Common_GetPagedList]
    (
    @TableName nvarchar(100), --表名
    @ColumnNames nvarchar(1000) = '*', --字段名集合(全部字段为*,其它逗号分隔)
    @OrderClause nvarchar(1000) =N' Id desc ', --排序从句(不包含order by)
    @WhereClause nvarchar(1000) =N' 1=1 ',    --条件从句(不包含where)
    @PageSize int = 0, --每页记录数(0为所有)
    @PageIndex int = 1,     --页索引(从1开始)
    @TotalRecord int output,     --返回总记录数
    @PageCount   int output     --返回总页数
    )
    AS
     
    BEGIN 
    if (@ColumnNames is null or @ColumnNames='') set @ColumnNames=' * '
    if (@WhereClause is null or @WhereClause='') set @WhereClause=' 1=1 '
    if (@OrderClause is null or @OrderClause='') set @OrderClause=' Id desc '
     
    --处理开始点和结束点
    Declare @StartRecord int;
    Declare @EndRecord int; 
    Declare @TotalCountSql nvarchar(1200); 
    Declare @SqlString nvarchar(4000);    
    
    --统计记录
    if(@TotalRecord is null OR @TotalRecord>=0)
    begin
    SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName +' where '+@WhereClause; 
    --select @TotalCountSql
    EXEC sp_executesql @TotalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
    SET @PageCount = ceiling( @TotalRecord*1.0/@PageSize)
    end
     
    if @PageSize>0
    begin    
    if @PageIndex<1 set @PageIndex=1
    set @StartRecord = (@PageIndex-1)*@PageSize + 1    
    set @EndRecord = @StartRecord + @PageSize - 1 
    set @SqlString = N'select row_number() over (order by '+ @OrderClause +') as rowId,'+@ColumnNames+' from '+ @TableName+' where '+@WhereClause;
    set @SqlString ='select * from (' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
    end
    else 
    begin
    set @SqlString='select '+@ColumnNames+' from '+ @TableName+' where '+@WhereClause +' order by '+@OrderClause
    end
    --select @SqlString
    Exec(@SqlString)
    END
    
    GO

     SQL2

    USE [DBCommonManage]
    GO
    /****** Object:  StoredProcedure [dbo].[spPagination]    Script Date: 10/24/2016 11:53:34 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[spPagination]
         @TableName varchar(255), -- 表名
         @InnerJoin varchar(500),  --inner john连接的表
       --  @InnerJoinCondition varchar(255),  --inner john连接条件 
         @SelectFields varchar(1000) = '*', -- 需要返回的列
         @OrderName varchar(255)='', -- 排序的字段名
         @PageSize int = 10, -- 页尺寸
         @PageIndex int = 1, -- 页码
         @Count bit = 0, -- 返回记录总数, 非0 值则返回
         @OrderType bit = 0, -- 设置排序类型, 非0 值则降序
         @WhereCondition varchar(1500) = '' -- 查询条件(注意: 不要加where) 
    AS 
    
    declare @strSQL varchar(5000) -- 主语句
    declare @strTmp varchar(110) -- 临时变量
    declare @strOrder varchar(400) -- 排序类型
    
    if @Count != 0 
         begin 
             if @WhereCondition !='' 
                 set @strSQL = 'select count(*) as Total from [' + @TableName + '] '+@InnerJoin +' where '+@WhereCondition 
             else 
                 set @strSQL = 'select count(*) as Total from [' + @TableName + '] '+@InnerJoin +' ' 
         end 
         --以上代码的意思是如果@Count传递过来的不是0,就执行总数统计。以下的所有代码都是@Count为0的情况
    
    else 
         begin 
             if @OrderType != 0 
                 begin 
                     set @strTmp = '<(select min' 
                     set @strOrder = ' order by [' + @OrderName +'] desc' 
                     --如果@OrderType不是0,就执行降序,这句很重要!
                 end 
            
             else 
                 begin 
                     set @strTmp = '>(select max' 
                     set @strOrder = ' order by [' + @OrderName +'] asc' 
                 end 
                 if @PageIndex = 1 
                     begin 
                         if @WhereCondition != '' 
                             set @strSQL = 'select top ' + str(@PageSize) +' '+@SelectFields+ ' from [' + @TableName + '] '+@InnerJoin +' where ' + @WhereCondition + ' ' + @strOrder 
                         else 
                             set @strSQL = 'select top ' + str(@PageSize) +' '+@SelectFields+ ' from ['+ @TableName + '] '+@InnerJoin + @strOrder 
                             --如果是第一页就执行以上代码,这样会加快执行速度
                     end 
                 else 
                     begin 
                         --以下代码赋予了@strSQL以真正执行的SQL代码
                         set @strSQL = 'select top ' + str(@PageSize) +' '+@SelectFields+ ' from ' 
                             + @TableName + ' '+@InnerJoin+ ' where [' + @OrderName + ']' + @strTmp + '(['+ @OrderName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @OrderName + '] from [' + @TableName + '] '+@InnerJoin +' ' + @strOrder + ') as tblTmp)'+ @strOrder 
                             if @WhereCondition != '' 
                         set @strSQL = 'select top ' + str(@PageSize) +' '+@SelectFields+ ' from ' 
                             + @TableName + ' '+@InnerJoin+ ' where [' + @OrderName + ']' + @strTmp + '([' 
                             + @OrderName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
                             + @OrderName + '] from [' + @TableName + '] '+@InnerJoin +'  where ' + @WhereCondition + ' ' 
                             + @strOrder + ') as tblTmp) and ' + @WhereCondition + ' ' + @strOrder
         end 
    end 
    
    print(@PageIndex)
    
    exec (@strSQL)
    

      

  • 相关阅读:
    第十五篇 -- 学习第十四天打卡20190702
    第三篇 -- 方向
    第十四篇 -- 学习第十三天打卡20190701
    yum更换阿里源
    Jenkins+sonar7.3集成
    xshell 5 书写汉字乱码
    zabbix 短信报警
    zabbix 微信报警
    zabbix邮件报警
    zabbix主动监测客户端设置
  • 原文地址:https://www.cnblogs.com/beipiaoxiaohuo/p/5753696.html
Copyright © 2020-2023  润新知