主题:[请教] EVALUATE()在SELE查询语句中为什么出问题?
北京种子乐
[专家分:3710] 发布于 2007-10-27 06:34:00
请看下面两个实例:
1、错误
FOR II=1 TO FCOU("操作表名")
VV="LSB_"+ALLTRIM(STR(II))
SELE 操作表名
VVV=FIEL(II)
SELECT &VVV. FROM 操作表名 WHERE NOT EMPTY(EVALUATE(VVV)) ;
GROUP BY &VVV INTO TABLE (VV)
USE
NEXT II
2、改为下式后正确
FOR II=1 TO FCOU("操作表名")
VV="LSB_"+ALLTRIM(STR(II))
SELE 操作表名
VVV=FIEL(II)
COPY TO LSB_JH FOR NOT EMPTY(EVALUATE(VVV))
SELECT &VVV. FROM LSB_JH GROUP BY &VVV INTO TABLE (VV)
USE
USE IN LSB_JH
NEXT II
看来问题出在EVALUATE()上,但觉得不应该,百思不得其解,敬请高师指教。
最后更新于:2007-10-27 07:00:00
回复列表 (共17个回复)
沙发
cbl518 [专家分:57140] 发布于 2007-10-27 07:34:00
老兄:你好
你太大意了。
该问题在 帮助文档中已明确指出:
在 SQL 查询的 WHERE 子句中包含 EVALUATE( ) 函数可能返回不正确的数据。
这与 SQL 查询 语句的运行扫描数据方式有关。
板凳
cbl518 [专家分:57140] 发布于 2007-10-27 08:00:00
SELE 名次表
FOR II=1 TO FCOUNT("名次表")
VV="LSB_"+LTRIM(STR(II))
VVV=FIELD(II,"名次表")
SELECT &VVV. FROM 名次表 WHERE NOT EMPTY(CURVAL(VVV)) ;
GROUP BY 1 INTO TABLE (VV)
USE IN (VV)
NEXT II
3 楼
cbl518 [专家分:57140] 发布于 2007-10-27 08:10:00
& 宏替换最好在查询语句中,只出现一次。
如果需要多次调用,可把整条查询命令,写成表达式,再用宏替换执行。
4 楼
北京种子乐 [专家分:3710] 发布于 2007-10-27 09:42:00
[quote]SELE 名次表
FOR II=1 TO FCOUNT("名次表")
VV="LSB_"+LTRIM(STR(II))
VVV=FIELD(II,"名次表")
SELECT &VVV. FROM 名次表 WHERE NOT EMPTY(CURVAL(VVV)) ;
GROUP BY 1 INTO TABLE (VV)
USE IN (VV)
NEXT II
[/quote]
cb1518弟你好:
我采用上面方式后,在“SELECT &VVV. FROM 名次表 WHERE NOT EMPTY(CURVAL(VVV)) GROUP BY 1 INTO TABLE (VV)”语句出现“函数要求使用行缓冲或表缓冲方式。”,是怎么回事?
5 楼
北京种子乐 [专家分:3710] 发布于 2007-10-27 10:01:00
[quote]老兄:你好
你太大意了。
该问题在 帮助文档中已明确指出:
在 SQL 查询的 WHERE 子句中包含 EVALUATE( ) 函数可能返回不正确的数据。
这与 SQL 查询 语句的运行扫描数据方式有关。[/quote]
多谢cb1518弟,看来我是误入禁区了。
6 楼
moz [专家分:37620] 发布于 2007-10-27 10:19:00
如果函数在SQL查询过程中是恒定不变的,
也就是说函数值与字段之间没有关系的话,
完全有必要使用变量值代替这样的函数,
因为SQL对每条记录进行查询的时候都需要计算一次函数的值.
因为VFP的SQL的智能还没能清楚分辨函数是否与字段有关的那个程度.
势必对查询速度与时间造成很大的浪费.
7 楼
北京种子乐 [专家分:3710] 发布于 2007-10-27 10:29:00
moz兄弟你好:
从0楼你能看出,实际需求中的字段名是多个,表也是多个,因而字段的名字只好用变量代,过去求得变量的值一直用EVAL()了,可没想到在SQL的查询语句中却出了问题。
8 楼
moz [专家分:37620] 发布于 2007-10-27 11:12:00
嗯,你在0楼的代码里好像忽略一个地方,你再试试看看:
SELECT &VVV. FROM 操作表名 WHERE NOT EMPTY(EVALUATE([color=ff00ff]&[/color]VVV)) ;
GROUP BY &VVV INTO TABLE (VV)
9 楼
北京种子乐 [专家分:3710] 发布于 2007-10-27 11:30:00
[quote]嗯,你在0楼的代码里好像忽略一个地方,你再试试看看:
SELECT &VVV. FROM 操作表名 WHERE NOT EMPTY(EVALUATE([color=ff00ff]&[/color]VVV)) ;
GROUP BY &VVV INTO TABLE (VV)[/quote]
moz兄弟你好:
我觉得有两点不妥:
1、1楼讲了,SQL查询语句中不能用EVAL()函数。
2、EVAL()函数里好象不能再用&了。
10 楼
moz [专家分:37620] 发布于 2007-10-27 11:41:00
经VFP9测试,完全推翻9楼所言.
我来回复