SAS条件逻辑,根据条件执行另一个sas程序

时间:2016-04-10 19:06:13

标签: if-statement sas sas-macro proc-sql

我有一个数据集命名为error_table,如下所示。所有变量都是字符

Errorno   Error     Resolution  
001     login       check 
002     datacheck   check

我想要一个执行sas计划的逻辑如果Errorno不在001002。否则停止执行并显示error_table

我尝试了以下

%macro test();
   proc sql;
      select trim(Error_No) into: num from error_table;
   quit;

   %if &num. not in ("001","002") %then %do;
       %include "/path/dev/program.sas";
   %end;
   %else %do;
      proc print data = error_table;
      run;
   %end;
%mend;
%test;

但是,这是一个错误。

任何人都可以请更正逻辑。

2 个答案:

答案 0 :(得分:0)

SELECT返回零行时,您需要注意这种情况。您应该为宏变量NUM设置默认值。

您的数据集变量是数字还是字符?使用TRIMMEDSEPARATED BY子句而不是TRIM()函数来防止由INTO子句生成的宏变量中的空格。

%let num=NONE;
select Error_No into: num trimmed from error_table;

请记住,宏处理器中的所有内容都是字符串,所以请不要引用您尝试匹配的值,除非它们实际上是值的一部分。

%if NOT (&num. in (001,002)) %then %do;

另外,要在宏代码中使用IN运算符,您需要确保已设置MINDELIMITER选项。

答案 1 :(得分:0)

我会将带有错误代码的移动条件提升到proc sql

proc sql;
   select count(*) into :num_errors
   from error_table
   where Errorno in ("001", "002");
quit;

然后在macrovariable中,您有多个001002错误。 下一步是检查宏观条件:

%if &num_errors. > 0 %then %do;
   %include "/path/dev/program.sas";
%end;
%else %do;
   proc print data = error_table;
   run;
%end;
%mend;