canyueyun 2011-10-11 12:33:34 3416次浏览 3条回复 0 0 0

用mssql数据库,cgridview,分页显示错误。 [attach]400[/attach] 共4条,每页3条,第2页应该只显示第四条才对。

经过查找发现源码是错误的,谁能帮改掉 framework\db\schema\mssql\CMssqlCommandBuilder.php

protected function rewriteLimitOffsetSql($sql, $limit, $offset)
{
    $fetch = $limit+$offset;
    $sql = preg_replace('/^([\s(])*SELECT( DISTINCT)?(?!\s*TOP\s*\()/i',"\\1SELECT\\2 TOP $fetch", $sql);
    $ordering = $this->findOrdering($sql);
    $orginalOrdering = $this->joinOrdering($ordering, '[__outer__]');
    $reverseOrdering = $this->joinOrdering($this->reverseDirection($ordering), '[__inner__]');
    $sql = "SELECT * FROM (SELECT TOP {$limit} * FROM ($sql) as [__inner__] {$reverseOrdering}) as [__outer__] {$orginalOrdering}";
    return $sql;
}
  • 回复于 2011-10-11 14:58 举报

    老大 舰长 能改吗

  • 回复于 2016-05-29 17:19 举报

    SELECT TOP 页大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 页大小*页数 id FROM 表 ORDER BY id)) ORDER BY ID
    用这个sql进行mssql分页,直接写sql解决,不用它的CDbCriteria了

  • 回复于 2016-05-29 17:26 举报

    或者这样,处理最后一页的数据集
    ` //如果是最后一页,需要去掉多余的记录

        if(Yii::app()->db->driverName == 'sqlsrv' && 不是第一页 && 是最后一页){
            $dataset = array_slice($dataset,多余记录数);
        }`
    
您需要登录后才可以回复。登录 | 立即注册