问题描述
请问有什么帮助吗? 当显示变量 vMonth 时,它是有效的,但是当将它与库名称连接时,得到以下问题。
计划:
%LET lastdayprevIoUsmonth = put(intnx('month',today(),-1,'E'),mmyyn4.);
%LET vMonth = cats('RM',&lastdayprevIoUsmonth);
PROC sql;
SELECT &vMonth,*
FROM MASU.&vMonth
WHERE nsgr = '040';
QUIT;
日志文件:
27 %LET lastdayprevIoUsmonth = put(intnx('month',mmyyn4.);
28 %LET vMonth = cats('RM',&lastdayprevIoUsmonth);
29
30 PROC sql;
31
32 SELECT &vMonth,*
33 FROM MASU.&vMonth
34 WHERE nsgr = '040';
NOTE: PROC sql set option NOEXEC and will continue to check the Syntax of statements.
NOTE: Line generated by the macro variable "VMONTH".
34 MASU.cats('RM',put(intnx('month',mmyyn4.))
_ _
79 79
200
ERROR 79-322: Expecting a ).
ERROR 200-322: The symbol is not recognized and will be ignored.
解决方法
宏代码只是做你告诉它做的事情。添加一些 %PUT 语句以查看您已将哪些值放入宏变量中。宏处理器不会像对待字符串 put
或 cats
那样对待像 xyz
或 123
这样的字符串。
如果您想在宏代码中调用 SAS 函数,您需要用 %sysfunc()
宏函数包装每个调用。并非所有函数都可以这样调用。特别是使用类型特定的版本代替灵活的 PUT() 和 INPUT() 函数。但在这种情况下,您可以只使用 %SYSFUNC() 调用的格式参数而不是函数调用。不要在字符串文字中包含引号,对于宏处理器来说,一切都是字符串文字。
使用这个:
%LET lastdaypreviousmonth=%sysfunc(intnx(month,%sysfunc(today()),-1,E),mmyyn4.);
无需在宏代码中使用 CAT...() 函数。要连接宏变量值,只需将它们展开到您希望它们出现的位置即可。
%LET vMonth = RM&lastdaypreviousmonth.;