ERROR: Operand missing for IN operator in argument to %EVAL function
ERROR: Operand missing for IN operator in argument to %EVAL function
在我的案例中我无法理解这个错误,因为我可以执行宏并且它工作得很好,我尝试 运行 在它给我这个错误 10 分钟后再次执行它,有时我会执行四次乘以第五个给我一个正确的结果。
这是我的代码:
%let list = &Control_1.
&Control_2.
&Control_3.
&Control_4.
;
%macro print_control_2(list) / minoperator ;
%let Control_2=Control_2;
%IF &Control_2. in &list. %THEN %DO;
proc sql;
...
;quit;
%end;
%mend;
%print_control_2(&list);
更好的做法是使用%symexist()
检查宏变量是否存在以保持日志干净。如果您有要检查的变量列表,则可以遍历宏变量列表。默认情况下,countw()
和 %scan()
会将空格视为分隔符。
%let list = Control_1
Control_2
Control_3
Control_4
;
%let Control_2 = Control_2;
%macro print_control_2(list);
%do i = 1 %to %sysfunc(countw(&list.) );
%let control = %scan(&list., &i.);
%if(%symexist(&control.) ) %then %put &control. exists.;
%end;
%mend;
%print_control_2(&list);
为了具体解决您的问题,您需要用 %bquote()
引用您的列表,因为它可能包含未解析的宏变量。这会破坏 IN 运算符。
还建议始终添加 mindelimiter
和 minoperator
,因为用户可以使用 autoexec 设置自己的 mindelimiter
默认值。这将保证始终使用您期望的分隔符。
%macro print_control_2(list) / minoperator mindelimiter=' ';
%IF &Control_2. in %bquote(&list.) %THEN %DO;
%put &control_2. exists.;
%end;
%mend;
%print_control_2(&list);
在我的案例中我无法理解这个错误,因为我可以执行宏并且它工作得很好,我尝试 运行 在它给我这个错误 10 分钟后再次执行它,有时我会执行四次乘以第五个给我一个正确的结果。 这是我的代码:
%let list = &Control_1.
&Control_2.
&Control_3.
&Control_4.
;
%macro print_control_2(list) / minoperator ;
%let Control_2=Control_2;
%IF &Control_2. in &list. %THEN %DO;
proc sql;
...
;quit;
%end;
%mend;
%print_control_2(&list);
更好的做法是使用%symexist()
检查宏变量是否存在以保持日志干净。如果您有要检查的变量列表,则可以遍历宏变量列表。默认情况下,countw()
和 %scan()
会将空格视为分隔符。
%let list = Control_1
Control_2
Control_3
Control_4
;
%let Control_2 = Control_2;
%macro print_control_2(list);
%do i = 1 %to %sysfunc(countw(&list.) );
%let control = %scan(&list., &i.);
%if(%symexist(&control.) ) %then %put &control. exists.;
%end;
%mend;
%print_control_2(&list);
为了具体解决您的问题,您需要用 %bquote()
引用您的列表,因为它可能包含未解析的宏变量。这会破坏 IN 运算符。
还建议始终添加 mindelimiter
和 minoperator
,因为用户可以使用 autoexec 设置自己的 mindelimiter
默认值。这将保证始终使用您期望的分隔符。
%macro print_control_2(list) / minoperator mindelimiter=' ';
%IF &Control_2. in %bquote(&list.) %THEN %DO;
%put &control_2. exists.;
%end;
%mend;
%print_control_2(&list);