我有这样的SAS宏:
%macro test;
proc sql;
SELECT count(*) INTO:Nbr_Obs from table1;
quit;
%put observations=&Nbr_Obs;
%if &Nbr_Obs=0 %then %do;
proc sql;
drop table table1 ;
quit;
%end;
%mend;
%put语句都没有出现在日志中,而'if'条件总是评估为true。我该如何解决这个问题?
编辑:这是我在日志中看到的:
MPRINT(TEST): proc sql;
MPRINT(TEST): SELECT count(*) INTO:Nbr_Obs from TABLE1;
MPRINT(TEST): quit;
observations=
...
...
此后,它显示SQL正在执行。所以似乎PU T语句在SQL之前执行?
答案 0 :(得分:1)
从使用INTO子句创建的宏变量中去除前导和尾随空白始终是最佳实践,这是不正确比较的原因。请修改如下,
%macro test;
proc sql;
SELECT count(*) INTO:Nbr_Obs
from table1;
quit;
%let Nbr_Obs=&Nbr_Obs; * Strips blanks;
%put observations=&Nbr_Obs;
%if &Nbr_Obs=0 %then %do;
proc sql;
drop table table1 ;
quit;
%end;
%mend;
答案 1 :(得分:0)
如果您的代码之前失败,SAS会设置SYNTAXCHECK
选项和OBS=0
。这意味着会读取和检查SQL语句的语法,但不会实际执行。这就是它们出现在MPRINT
输出中的原因。
使用以下方法重置系统选项:
OPTIONS NOSYNTAXCHECK OBS=MAX;
再试一次。