A instrução EVAL utiliza um valor de caractere, interpreta-o como uma instrução SQL e o processa.
A função EVAL (também descrita aqui) utiliza um valor de caractere, mas o interpreta como uma expressão ESQL que retorna um valor.
EVAL toma um parâmetro na forma de uma expressão, avalia essa expressão e lança o valor resultante em uma cadeia de caracteres, se já não for uma. Portanto, a expressão transmitida para EVAL deve poder ser representada como uma cadeia de caracteres.
Nos exemplos a seguir, A e B são variáveis escalares inteiras e scalarVar1 e OperatorAsString são variáveis escalares da cadeia de caracteres.
A expressão A+B é aceitável porque, embora retorne um valor inteiro, os valores inteiros podem ser representados como cadeias de caracteres e o lançamento necessário é realizado antes que EVAL continue com o segundo estágio da sua avaliação.
O ponto-e-vírgula colocado no fim do literal da cadeia final é necessário porque, se EVAL estiver sendo utilizado no lugar de uma instrução ESQL, a avaliação do seu primeiro estágio deve retornar uma cadeia que represente uma instrução ESQL válida, incluindo o ponto-e-vírgula de encerramento.
As variáveis declaradas em uma instrução EVAL não existem fora dessa instrução EVAL. Dessa maneira, EVAL é semelhante a uma função, na qual as variáveis declaradas localmente são apenas locais e saem do escopo quando a função é encerrada.
A capacidade real de EVAL é que ela permite construir dinamicamente instruções ou expressões ESQL. No segundo e no terceiro exemplos acima, o valor de scalarVar1 ou operatorAsString pode ser definido de acordo com o valor de um campo de mensagem de entrada ou outro valor dinâmico, permitindo controlar efetivamente qual ESQL é executado, sem necessidade de uma escada IF THEN potencialmente comprida.
No entanto, considere as implicações de desempenho na utilização de EVAL. A construção e execução dinâmicas de instruções ou expressões consomem, necessariamente, muito mais tempo do que a simples execução das instruções ou expressões pré-construídas. Se o desempenho for vital, prefira escrever ESQL mais específico, porém mais rápido.
Neste exemplo, EVAL está sendo utilizado para substituir uma referência de campo, não uma expressão.
Neste exemplo, (SELECT T.x FROM Database.y) transmitido para EVAL retorna uma lista, que não é representável como uma cadeia de caracteres.
SET OutputRoot.XML.Data.Result[] = EVAL('(SELECT T.x FROM Database.y AS T)');