我有以下问题:
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过程。
注:
我使用Delphi 2007和MySQL 5.1与ZEOS 6.6.6。
虽然我很确定版本不重要。
我不愿意切换版本,因为我已经深入到项目中了。
这是不可能的,你只能参数化这个值。最好的方法是使用SQL。Text:= StringReplace()但是你失去了准备查询的速度
MySQL有能力让用户变量(基于会话)被引用到@(所以我讨厌说LaKraven有点偏离目标)。我有同样的问题与Dac MySQL (http://www.microolap.com/products/connectivity/mysqldac/)在工作中。他们通过添加特殊检查来检查':'后面的字符是否是'='来进行纠正,如果是,则不进行参数替换。
我不太了解Zeos组件,所以我唯一能建议的是跟踪执行路径,查看异常发生的位置,并修补代码以处理':='
我不知道这里是不是这样,但是你在SQL中有错误:IF
中的分号应该用逗号代替,AS rank
和group
之后缺少逗号是保留词,所以当用作表名时,应该用' '引用。
尝试设置TZQuery。ParamCheck为False。当':'是参数标记时,将禁用自动创建参数。
好了,我破解了一个解决方案。
但它确实是丑陋的,但它仍然工作(有点)。
编辑,这个工作在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是存储过程中的持久(当然是在单个连接中)。在select语句和存储过程之间交换@varname在dbForge中是有效的,但是在Delphi中是失败的。