在delphi查询中使用@variables:=不起作用

时间:2011-04-11 19:30:41

标签: mysql delphi delphi-2007 zeos

我有以下问题。

ZQuery1.SQL.Text:= 
  ' SELECT                                                  '+
  '   IF(q.rank2 = 1, @rank:= 1, @rank:= @rank + 1) AS rank '+
  '   ,q.* FROM (                                            '+
  '   SELECT groep.id - MinGroepId(groep.id) AS rank2       '+
  '     ,groep.otherfields                                  '+
  '   FROM groep                                            '+
  '   ORDER BY rank2 ) q;                                   ';
ZQuery.Open;

当我运行此代码时,我在ZQuery1中得到异常Incorrect token followed by ":" 我该如何解决?我需要使用Delphi,因为我不能把这个选择放在MySQL程序中 Zeos 6不支持返回结果集的MySQL过程。

P.S。
我正在使用Delphi 2007和MySQL 5.1和ZEOS 6.6.6 虽然我很确定版本无关紧要 我不愿意切换版本,因为我太过深入了解项目。

5 个答案:

答案 0 :(得分:2)

这不能做,你只能参数化这个值。 你可以做的最好是SQL.Text:= StringReplace(),但是你失去了准备查询的速度。

答案 1 :(得分:1)

MySQL能够拥有被称为@的用户变量(基于会话)(所以我不愿意说LaKraven稍微偏离了标记)。 我在使用Dac for MySQL(http://www.microolap.com/products/connectivity/mysqldac/)时遇到了同样的问题。他们通过特殊检查来确定':'之后的字符是否为'=',如果是,则不会发生参数替换。

我对Zeos组件知之甚少,所以我唯一可以建议的是你追查执行路径并查看异常发生的位置并修补代码以处理':'的字符序列: ='

答案 2 :(得分:0)

我不知道这里是否是这种情况,但你的SQL中有错误:IF中的分号应该用逗号替换,AS rank和{{1后面有逗号丢失是保留字所以当用作表名时,它应该在``中引用。

答案 3 :(得分:0)

尝试将TZQuery.ParamCheck设置为False。当':'是参数标记时,这将禁用自动参数创建。

答案 4 :(得分:0)

好的,我破解了一个解决方案 但它肯定是丑陋的,仍然有效(sorta)。

编辑,这个适用于dbForge-MySQL和Delphi

首先,我在MySQL中创建了一个存储函数'ranking',它在@rank中存储了一个值和/或偏移量。

CREATE DEFINER = 'root'@'localhost'
FUNCTION MyDatabase.Ranking(NewRank INT, Addition INT)
  RETURNS int(11)
BEGIN
  IF NOT(NewRank IS NULL) THEN SET @rank:= NewRank; END IF;
  IF NOT(Addition IS NULL) THEN SET @rank:= @rank + Addition; END IF;
  RETURN @rank;   
END

接下来,我将ZQuery1更改为:

select ranking(null,1) as rank
  ,groep.*
  from groep
join (select ranking(0,null)) r

这很有效,Delphi中完整复杂的代码也可以使用。(-_-')
另一个战胜邪恶机器的胜利

所以回顾一下 @varname在存储过程中持久 (当然在单个连接中) 在dbForge中的select语句和存储过程工作之间交换@varname,但在Delphi中失败