【发布时间】:2018-01-28 15:47:06
【问题描述】:
我有一段代码参数化了一百个左右相似但不相同的 SQL 语句,我需要生成我需要的数据。除了 where 语句之外,参数化工作正常。我正在传递以下格式的宏字符串:
where PERIOD_LAST_DTTM = '31DEC2017:23:59:59'dt
and myvar1 = 1 and myvar2 < 0
and myvar3 in ('SOME STRING', 'SOME OTHER STRING')
...使用以下语法:
%if %eval(&inn_sel_var. ^= &comp_var2.) %then %do;
&inn_sel_var.
%end;
/&inn_sel_var 是字符串 &comp_var2 = NULL/
...但出现以下错误:
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:
where PERIOD_LAST_DTTM = '31DEC2017:23:59:59'dt and myvar1 = 1 and myvar2 < 0 and myvar3 in ('SOME STRING', 'SOME OTHER STRING')
^= NULL
ERROR: %EVAL function has no expression to evaluate, or %IF statement has no condition.
ERROR: The macro MODEL_CHECKS will stop executing.
...我尝试过使用 %STR、%SUPERQ、%QUOTE、%BQUOTE、%NRQUOTE、%NRBQUOTE 和 %UNQUOTE,但我不断遇到错误。有人可以建议我需要做什么才能正确输入参数化的 where 语句吗?
谢谢
【问题讨论】:
-
调试这种性质的宏问题需要很好地理解正在运行的宏变量。你可以在
options mtrace mprint;开启时发布一些日志吗?此外, %if 执行隐式 %eval,如果仅删除令牌 $eval 是否会发生相同的错误?你能显示宏声明和调用吗?你能展示在宏声明和宏调用中使用宏引用函数所做的实际尝试吗? -
当其中一个包含 WHERE 语句/子句时,为什么这两个宏变量具有相同的值?您是否只是想测试两个 where 子句是否使用完全相同的字符?
-
使用
options mlogic symbolgen查看更多...