用户
 找回密码
 入住 CI 中国社区
搜索
123
返回列表 发新帖
楼主: Hex
收起左侧

[修补 Patch] [2.0.2]MSSQL 分页方法(limit)

[复制链接]
 楼主| 发表于 2011-10-21 16:14:43 | 显示全部楼层
9streets 发表于 2010-8-10 18:31
回复 5# Hex

query 和 limit 不能混合用,请参考手册。
发表于 2011-10-24 10:50:33 | 显示全部楼层
本帖最后由 iserich 于 2011-10-24 10:52 编辑

菜鸟发布。。。。请各位大侠指教。

参考英文官网论坛帖子,
http://codeigniter.com/forums/viewthread/122798

修改system/database/drivers/mssql/mssql_drive.php中的 _limit函数

PHP复制代码
function _limit($sql, $limit, $offset)
        {
 
                $str=strtolower(str_replace("\n",' ',$sql));
               
                //表名
                $strtemp=substr($str,strpos(strtolower($str),'from ')+5);
                $tablename=substr($strtemp,0,stripos($strtemp,' '));
               
                ///排序
                $orderby=substr($str,strpos(strtolower($str),'order by ')+9);
               
                //查询条件 (未考虑group by 及其他情况)
                if(strpos(strtolower($str),'where ')){
                $where=substr($str,strpos(strtolower($str),'where ')+6, strpos(strtolower($str),'order by ')-strpos(strtolower($str),'where ')-6);
                if($where)$where='where '.$where;
                }
 
                $sql = "
                SELECT *
              FROM
                  ( SELECT *, ROW_NUMBER() OVER (ORDER BY $orderby) as NroFila
                    FROM  $tablename $where
                   ) AS PAG_TABLEXXX
              WHERE
              NroFila BETWEEN "
.($offset?$offset+1:1)." AND ".($offset+$limit)."
              "
;
               
                return $sql;
        }
复制代码


未测试效率---理论上简单实现,未仔细测试
本人绝对小菜一名,水平有限,求优化!
发表于 2012-1-5 17:05:07 | 显示全部楼层
假如用户没有查询master数据库的权限,怎么办?
发表于 2012-2-25 23:07:28 | 显示全部楼层
关注中 没有找到好的解决办法
发表于 2012-11-16 09:51:16 | 显示全部楼层
我用的AR 写的,可是还是错误
发表于 2012-11-16 10:01:31 | 显示全部楼层
DECLARE mi_cursor_ea9bcad4cdc7e8b7601d42808c0160eb CURSOR DYNAMIC READ_ONLY FOR SELECT s.hotel_id, s.name, s.en_name, s.price, s.deleted, o.name as type_name, a.name as star_name, room.name as room_name, b.name as b_name FROM hotel as s LEFT JOIN option_type as o ON o.type_id = s.type_id LEFT JOIN option_star as a ON a.star_id = s.star_id LEFT JOIN hotel_brand as b ON b.brand_id = s.brand_id LEFT JOIN hotel_room as room ON room.hotel_id = s.hotel_id OPEN mi_cursor_ea9bcad4cdc7e8b7601d42808c0160eb DECLARE @CURSOR AS INT SELECT @CURSOR = CURSOR_HANDLE FROM MASTER.DBO.SYSCURSORS WHERE CURSOR_NAME = 'mi_cursor_ea9bcad4cdc7e8b7601d42808c0160eb' EXEC SP_CURSORFETCH @CURSOR, 32, 1, 2 EXEC SP_CURSORCLOSE @CURSOR  这是打印的sql
发表于 2012-11-16 10:02:12 | 显示全部楼层
  把这些sql放在  sqlserver工具里运行,错误提示消息 21,级别 21,状态 1,第 1 行
警告: 在 11 16 2012 10:00AM 出现错误 615。请记录该错误和时间,并与您的系统管理员联系。
 楼主| 发表于 2012-11-16 14:00:15 | 显示全部楼层
。笨才~ 发表于 2012-11-16 10:02
把这些sql放在  sqlserver工具里运行,错误提示消息 21,级别 21,状态 1,第 1 行
警告: 在 11 16 2012  ...

貌似不能直接运行。
发表于 2012-11-17 20:15:29 | 显示全部楼层
Hex 发表于 2012-11-16 14:00
貌似不能直接运行。

我的sqlserver是2005 貌似你修改的代码不兼容吧

本版积分规则