用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6530|回复: 4
收起左侧

[修补 Patch] 分享个自己解决MSSQL 分页的limit 问题

[复制链接]
发表于 2009-10-6 10:49:09 | 显示全部楼层 |阅读模式
本帖最后由 lihao812 于 2009-10-13 10:02 编辑

坛子查了N编了,郁闷就是找不到怎么解决 MSSQL LINIT的问题.
于是自己改写了limit函数.代码如下:

PHP复制代码
function _limit($sql, $limit, $offset)
{
  $TableWhere = strstr($sql,'FROM ');
  if($limit >=$offset){
  return  preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$offset.' ', $sql.'AND ID>(SELECT MAX(ID) FROM(SELECT TOP '.$limit.' ID '.$TableWhere.') AST )');
  }
  else{
   return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$offset.' ', $sql);
  }
}
复制代码

不好用拍我砖,我很菜的!

---------------------------------------------------------

修正一下,上面的修改limit是可以暂时解决问题,但是后来发现
$this->db->order_by('ID DESC');

不能用了,几经周折,终于找到方法了.但不支持ASC DESC同时使用. -_-!~~望高手指点!

在mssql_driver.php增加变量

var $RSnum = '0';//这个值是结果总数.分页调用的时候给赋值,

$this->db->RSnum = $config['total_rows'];//记录总数.
PHP复制代码
 
 
function _limit($sql, $limit, $offset)
{
  //$i = $limit + $offset;
  return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$offset.' ', $sql);  
}
 
复制代码


在DB_active_rec.php增加了个自定义函数:

PHP复制代码
 
//函数功能:处理MSSQL的 limit 参数.
 function _mssqlLimitStr($sql){
  if($this->dbdriver == 'mssql'){
  $TableWhere = strstr($sql,'FROM ');
  if($this->ar_limit >= $this->ar_offset){
    $MaxID = $this->ar_limit;
    if(stristr(implode(', ', $this->ar_orderby),'DESC') =='DESC'){
     $Select = '<=';$MaxID = $this->RSnum-$this->ar_limit;
    }
    else if($this->ar_limit == $this->ar_offset)$Select = '>'; else $Select = '>=';
    $Temp=' AND ID'.$Select.'(SELECT MAX(ID) FROM(SELECT TOP '.$MaxID.' ID '.$TableWhere.') AST )';
    return $Temp;
   }
  }
 }
 
复制代码


修改 order_by 处理sql 的地方(大概在1582行):
PHP复制代码
 
  // Write the "ORDER BY" portion of the query
  if (count($this->ar_orderby) > 0)
  {
   $sql .= $this->_mssqlLimitStr($sql);
   $sql .= "\\nORDER BY ";
   $sql .= implode(', ', $this->ar_orderby);
   if ($this->ar_order !== FALSE)
   {
    $sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC';
   }
  }
 
复制代码


这样就完美支持 ORDER BY了. 其他的AR功能还没测试.先放出来分享了.

评分

参与人数 1威望 +5 收起 理由
Hex + 5 我很赞同

查看全部评分

发表于 2009-10-6 11:36:15 | 显示全部楼层
噢 好像很少人用mssql的噢

我想问下 为什么不用mysql要用mssql的呢
 楼主| 发表于 2009-10-6 14:17:09 | 显示全部楼层
mysql 属于小型数据库,商业用途有点不适用.
发表于 2009-10-19 11:41:16 | 显示全部楼层
看看。。。
发表于 2012-2-1 17:19:46 | 显示全部楼层
先谢谢了,遇到同样问题

本版积分规则