Hex 发表于 2011-10-21 16:14:43

9streets 发表于 2010-8-10 18:31 static/image/common/back.gif
回复 5# Hex




query 和 limit 不能混合用,请参考手册。

iserich 发表于 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函数

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;
      }

未测试效率---理论上简单实现,未仔细测试
本人绝对小菜一名,水平有限,求优化!

wt_yao 发表于 2012-1-5 17:05:07

假如用户没有查询master数据库的权限,怎么办?

sy88618816 发表于 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。请记录该错误和时间,并与您的系统管理员联系。

Hex 发表于 2012-11-16 14:00:15

。笨才~ 发表于 2012-11-16 10:02 static/image/common/back.gif
把这些sql放在sqlserver工具里运行,错误提示消息 21,级别 21,状态 1,第 1 行
警告: 在 11 16 2012...

貌似不能直接运行。

。笨才~ 发表于 2012-11-17 20:15:29

Hex 发表于 2012-11-16 14:00 static/image/common/back.gif
貌似不能直接运行。

我的sqlserver是2005 貌似你修改的代码不兼容吧
页: 1 2 [3]
查看完整版本: [2.0.2]MSSQL 分页方法(limit)