mssql中limit到top的sql转换不正确

#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