【问题标题】:Parameterised SQL WHERE statement and SAS Macro Language problems参数化 SQL WHERE 语句和 SAS 宏语言问题
【发布时间】: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查看更多...

标签: sql sas sas-macro


【解决方案1】:

您需要展示更多您的程序和/或日志。

但是使用%superq() 应该可以防止在您的%IF 语句中出现这种类型的错误消息。

%if %superq(inn_sel_var) ne %superq(comp_var2) %then &inn_sel_var. ;

当然,INN_SEL_VAR 宏变量的值可能仍会在生成的 SAS 代码中产生错误。

【讨论】:

  • 您好,感谢您的回复。好的,这似乎现在有效。我在 %superq 中引用的宏变量的开头使用了一个&符号,而您没有。我不确定为什么/如何不在这里使用 & 符号会起作用...
  • %superq() 采用宏变量的名称来引用。如果您有一个包含要引用的宏变量名称的宏变量,则只能使用&amp;
  • 好的。 %superq 可以掩盖日志中的错误吗?我在 EG 会话中收到一个红色的“x”,表明发生了错误,但在日志中看不到“错误:”或任何带红色下划线的文本。
  • 宏引用事故可能会对 SAS 会话造成严重破坏。重新初始化您的 SAS 会话,或者如果您不知道如何重新启动 EG。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多