日期:2014-05-16  浏览次数:20719 次

[共享]我的高效mysql分页存储过程...
总是习惯了mssql上面的存储过程分页,然后结合AspNetPager分页控件(http://www.webdiyer.com/AspNetPager/default.aspx),这样就完成了记录的分页显示;

由于最近用到mysql,由于mssql,mysql两者的表达语法和语法约束上的区别,导致写起mysql上的分页版本有点“复杂”。经过查找一番资料后终于把它“复制”了。

存储过程分页的基本原理:我们先对查找到的记录集(支持输入查找条件_WhereClause和排列条件_OrderBy)的key字段临时存放到临时表,然后构建真正的记录集输出。

CREATE   PROCEDURE   `mysqltestuser_SELECT_PageAble`(
        _WhereClause   VARCHAR(2000),     --   查找条件
        _OrderBy   VARCHAR(2000),     --   排序条件
        _PageSize     INT   ,       --   每页记录数
        _PageIndex   INT   ,     --   当前页码
        _DoCount       BIT       --   标志:统计数据/输出数据
)
        NOT   DETERMINISTIC
        SQL   SECURITY   DEFINER
        COMMENT   ' '
BEGIN
  --   定义key字段临时表
  DROP   TABLE   IF   EXISTS   _TempTable_KeyID;     --   删除临时表,如果存在
  CREATE   TEMPORARY     TABLE     _TempTable_KeyID
  (
userid   INT
  )TYPE=HEAP;

  --   构建动态的sql,输出关键字key的id集合
  --   查找条件
  SET   @sql   =   'SELECT     userid   FROM   mysqltestuser ';
  IF   (_WhereClause   is   NOT   NULL)     AND   (_WhereClause   <>   ' ')   THEN
  SET   @sql=   concat(@sql,   '   WHERE   '   ,_WhereClause);
  END   if;

  IF   (_OrderBy   is   NOT   NULL)     AND     (_OrderBy   <> ' ')   THEN
  SET   @sql=   concat(   @sql   ,   '   ORDER   BY   '   ,   _OrderBy);
  END   IF;

  --   准备id记录插入到临时表
  set   @sql=concat( 'insert   into   _TempTable_KeyID(userid) ',   @sql);
  PREPARE   stmt   FROM   @sql;
  EXECUTE   stmt   ;
  DEALLOCATE   PREPARE   stmt;
--   key的id集合     [end]

--   下面是输出
IF   (_DoCount=1)   then     --   统计
          BEGIN
                    SELECT   COUNT(*)   AS   RecordCount   FROM   _TempTable_KeyID;
          END;
ELSE                                   --   输出记录集
          BEGIN
                  --   计算记录的起点位置
  SET   @startPoint   =   ifnull((_PageIndex-1)*_PageSize,0);
                  SET   @sql= '                 SELECT           A.*
      FROM       mysqltestuser   A
      INNER   JOIN   _TempTable_KeyID   B
      ON     A.userid   =B.userid &nb