mssql中limit到top的sql转换不正确
发布于:2022-01-17 09:50:54
#1 awenai
定位: Drivers/mssql.php
函数: translimit
测试 echo translimit("select * from table limit 1,2");
=> SELECT * from ( SELECT TOP 2 * from ( SELECT TOP 3 * from table ) AS SPTMP_MSSQL_TOTLERESULT ) AS SPTMP_MSSQL_ALLRESULT
如果记录如下:
id val
1 a
2 b
3 c
我要取的是id为2,3的记录
但很显然转换后所取的记录是id为1,2的记录
2011-08-01 22:27:01
#2 awenai
晕, 研究代码好长时间了, 因为我自己也想写一个db的adapter
2011-08-01 22:30:15
#3 jake
相信你是研究过代码的。当然也希望你体谅一下,很多那种自己程序写错了、也没看过SP的代码就出来乱说的人——当然最终都是发现是自己代码问题,连稍微问一下看一下的想法都没有直接指责框架本身——非常的令人无语,所以不得不改一下设置。
这个translimit我是实际从数据库操作里面测试的,之前没发现有取错的情况。后面我再测试一下。
另外如果你有好的解决方法代码,也希望能分享一下。
:handshake
2011-08-01 22:37:13
#4 awenai
解释一下能理解.
你测试可能没有考虑到sql语句中没有order by子句的情况.
如果是这样, 你函数中的$order_id就没有值.
按照你程序的逻辑,
如果select的columns不是*, 则好办,手动取一列进行反向order by就可以修正这一问题.
如果是*,考虑是否可以用聚合函数,或者事先将*转换成所有列名.
如果是SQL2005, 可以使用ROW_NUMBER()
SQL2000也有一些替代方法, 不过对于你这里的通用情况, 好像不太适用.
2011-08-01 23:14:04
#5 awenai
另外, 这个函数还有一点小问题,
就是没有考虑到 LIMIT 10, 20 逗号后面有空格的情况, 而这种写法是合法的.
2011-08-01 23:20:50
#6 jake
嗯,这样的。
之前有考虑过,mssql驱动需要另一个spModel,这样就不用对limit做什么了,这种方式是否更好呢?
2011-08-02 07:34:59