我有一个数据集命名为error_table
,如下所示。所有变量都是字符
Errorno Error Resolution
001 login check
002 datacheck check
我想要一个执行sas
计划的逻辑如果Errorno
不在001
和002
。否则停止执行并显示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;
但是,这是一个错误。
任何人都可以请更正逻辑。
答案 0 :(得分:0)
当SELECT
返回零行时,您需要注意这种情况。您应该为宏变量NUM设置默认值。
您的数据集变量是数字还是字符?使用TRIMMED
或SEPARATED 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中,您有多个001
或002
错误。
下一步是检查宏观条件:
%if &num_errors. > 0 %then %do;
%include "/path/dev/program.sas";
%end;
%else %do;
proc print data = error_table;
run;
%end;
%mend;