3

我有以下问题。

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;

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

PS
我正在使用 Delphi 2007 和 MySQL 5.1 和 ZEOS 6.6.6。
虽然我很确定版本无关紧要。
我不愿意切换版本,因为我对项目太远了。

4

5 回答 5

2

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

于 2011-04-11T19:37:25.787 回答
1

MySQL 具有引用 @ 的用户变量(基于会话)的能力(所以我讨厌说 LaKraven 有点离题)。我在工作中使用 Dac for MySQL (http://www.microolap.com/products/connectivity/mysqldac/) 时遇到了同样的问题。他们通过特殊检查来纠正':'之后的字符是否是'=',如果是,则不会发生参数替换。

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

于 2011-04-11T20:11:18.303 回答
0

我不知道这里是否是这种情况,但是您的 SQL 中有错误:IF应该用逗号替换分号,后面缺少逗号,AS rank并且group是保留字,因此当用作表名时,应在 `` 中引用.

于 2011-04-11T19:43:27.277 回答
0

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

于 2011-04-11T20:10:50.713 回答
0

好的,我破解了一个解决方案。
但它确实很丑陋,但它仍然有效(排序)。

编辑,这个适用于 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 中失败。

于 2011-04-11T20:35:38.870 回答