EVAL 语句获取一个字符值,将它解释为 SQL 语句,然后处理它。
EVAL 函数(下面还会描述)获取一个字符值,但将它解释为返回一个值的 ESQL 表达式。
EVAL 以表达式的形式获取一个参数,接着对该表达式求值,然后将得到的结果值数据类型转换为字符串(如果得到的结果还不是字符串)。因此,传递到 EVAL 的表达式必须能表示为字符串。
在下面的示例中,A 和 B 是整数标量变量,scalarVar1 和 OperatorAsString 是字符串标量变量。
表达式 A+B 是可接受的,因为尽管它返回整数值,但整数值可表示为字符串,因此在 EVAL 继续其求值的第二阶段之前将执行必需的数据类型转换。
最后的字符串文字结束处的分号是必需的,因为如果使用 EVAL 替代 ESQL 语句,它的第一阶段求值必须返回代表包含终止分号的有效 ESQL 语句的字符串。
EVAL 语句中声明的变量不存在于该 EVAL 语句外。在这方面,EVAL 类似于函数,在它里面本地声明的变量仅是本地的,当函数退出时,作用域将不再有效。
EVAL 的真正强大之处在于它允许您动态构造 ESQL 语句或表达式。在上述第二、第三个示例中,scalarVar1 或 operatorAsString 的值可根据入局消息字段的值或其他动态值来设置,因此允许您无需可能会变得冗长的 IF THEN 框架即可有效地控制执行哪些 ESQL。
但请考虑使用 EVAL 的性能影响。语句或表达式的动态构造和执行与简单地执行预先构造好的语句或表达式相比,必然需要更多的时间。如果性能很重要,可取的是编写更特定但更快的 ESQL。
在此示例中,EVAL 用于替换字段引用,而不是表达式。
在此示例中,传递到 EVAL 的 (SELECT T.x FROM Database.y) 返回列表,它不能表示为字符串。
SET OutputRoot.XML.Data.Result[] = EVAL('(SELECT T.x FROM Database.y AS T)');