您的问题几乎肯定与执行时间有关。尤其是在使用时
call execute
如果宏变量在给定有用值之前由SAS处理器解决,则很容易遇到计时问题。
下面是一个简单的例子。我专门创建了一个数据集,这样您就可以看到何时发生了这种情况(这不是必要的步骤,也不影响示例,它只是创建了一个有用的日志条目)。
请注意,当宏单独运行时,一切都按预期工作;但当它与
调用执行
这个
%put
执行
之前
宏实际执行。
第三个示例使用
%nrstr
强制SA在实际运行宏之前不尝试解析宏-这会导致正确提交宏。
实际上,第一个
调用执行
版本让sas处理宏文本,然后将其提交到sas.exe,这是您真正不想要的。添加
%NRSTR
解决了这个问题。
%macro do_something();
%local mlist;
data class_m;
set sashelp.class;
where sex='M';
run;
proc sql;
select name into :mlist separated by ' '
from class_m;
quit;
%put &=mlist;
%mend do_something;
%put Macro run on its own;
%do_something;
%put Macro run via call execute;
options mprint symbolgen;
data _null_;
set sashelp.class;
if _n_=1 then call execute('%do_something()');
stop;
run;
%put Macro run with nrstr and call execute;
data _null_;
set sashelp.class;
if _n_=1 then call execute('%nrstr(%do_something())');
stop;
run;