这是一篇针对工作中遇到SAS宏报错,如何debug的总结笔记:

先看SAS宏本身是不是能够运行的

  1. 先仅运行SAS宏,也就是%macro%mend的部分,观察是否能够正常运行,如果出错一般是宏内部SAS语句不全造成的,不全的几种情况:(1)SAS语句的符号漏、错;(2)SAS宏内的if-then-else-end之类的语句忘记加%,但正常data步里不需要;

打开options,方便调试

  1. options mprint mlogic symbolgen;,开了这几个options之后,mprint会将执行的宏代码内容编译显示;mlogic会显示宏执行的开始结束以及宏变量的解析;symbolgen会显示宏变量在宏语句执行过程中的赋值和解析。

加入%put,定位错误位置

  1. 在你认为出错的地方加%put,语句正常就能打印内容出来,方便定位宏出错的位置和宏变量的内容。

分段运行程序,查看报错位置与原因

  1. %return或者%abort cancel,控制宏运行的部分,前者是不打断宏运行,后者是写在哪里,后续部分就不运行。%abort 后面虽然有其他选项,但是最好只用cancel,因为其他语句可能会将SAS进程暴力终止。

options mprint mlogic symbolgen;
​
%macro test(var1=, var2=,);
​
    data a;
        a = 1;
        b = 2;
        c = a + b + &var2;
        d = "&var1";
    run;
​
    /* 在这里进行调试 */
    %return;
    /* %return,该宏只运行上半部分,不打断全部sas程序运行;%abort cancel,全部sas程序只运行到这里 */
​
    data b;
        a = 'Yes';
        b = 'No';
        c = catx('-', a, b, &var2);
    run;
​
%mend test;
​
%test(var1=%str(Insert Var), var2=5);

程序内多个宏,打印宏运行结果

  1. 如果一个sas程序里有很多宏要运行,也可以在宏内部加这样一句代码:

%put %str(W)ARNING: [&sysmacroname.] did not execute normally.

注意要结合宏里面的条件写,比如某数据集某变量为空等,在条件里加这句代码。这样,在运行sas程序如果条件不满足,就能够迅速定位到该宏。

总结

上述内容只是debug的一些小方法,能否debug成功更重要的是要了解整个宏的功能、用到各个数据集的来源及去处、对SAS宏和代码的熟悉程度。 如果有我没提到的debug方法,欢迎各位发布在评论区,相互探讨!