SAS中没有正确解析宏变量

时间:2015-12-03 21:39:37

标签: sas sas-macro

我有这样的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之前执行?

2 个答案:

答案 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;

再试一次。