【问题标题】:Ending a SAS-Stored process properly正确结束 SAS 存储的进程
【发布时间】:2015-09-25 13:09:35
【问题描述】:

我有一个 SAS-Storedprocess,它通过 webout 进行一些 html 输出。 在某些情况下(例如:没有可用数据)我想放置一条自定义错误消息并阻止该进程进一步执行。

我有一个到目前为止运行良好的 makro 解决方案:

%if &varnobs = 0 %then %do;
 data _null_;
    file _webout;   
    put " &text1";
    put " &text2";
    put " &text3";
 run;
ENDSAS; 
%end;

但现在我被告知,我们公司不允许使用 ENDSAS,因为它会产生各种副作用,并且不仅可以停止流程,还可以停止整个会话。

现在我正在寻找替代方案,我也尝试了带有多个选项的 abort 语句,但存在一个问题,即 abort 在日志中放置一条错误消息,因此不会显示我的自定义消息,而是显示 sas 错误信息。在中止文档中还声明了(abort),中止不仅会停止进程,还会停止会话。

我知道有诸如 if-else 或 goto 之类的编程替代方法来代替停止进程,但这不是针对我的特定问题的选项。

所以问题是:

如何在执行期间停止存储过程,而不停止会话,没有其他副作用并且没有 SAS 错误消息?

【问题讨论】:

    标签: sas


    【解决方案1】:

    你试过转动设置NOERRORABEND吗?可能是一个可能的选择。

    【讨论】:

      【解决方案2】:

      这是一个有趣而棘手的领域。在某些设置中,设置系统选项:

      options obs=0 noreplace;
      

      可以作为代理。

      【讨论】:

        【解决方案3】:

        您可以执行 if else 方法来防止额外代码运行并将自定义消息错误打印为

        %if &data ne "" %then;
           *your code;
        
        %else
          data _null_;
           file _webout;
            put 'html code of custom message';
          run;
        

        【讨论】:

          【解决方案4】:

          SAS 在错误处理方面很糟糕,所以我的建议是尽可能避免错误;-)

          除了玩笑,是的,除了endsas%abort cancel 之外,选择有限;

          您可以尝试将检查后的所有代码移动到有条件执行的%include 语句中。比如:

          %macro conditional_execute;
            %if &some_condition %then %do;
              %include "rest_of_logic_to_perform.sas";
            %end;
            %else %do;
              %put ERROR: CUSTOM ERROR MESSAGE HERE;
            %end;
          %mend;  
          

          包含而不是将所有代码放入宏的原因是我假设仍有大量的处理需要执行。如果它是一小段代码,那么是的,你可以把它放在%if 条件中。

          【讨论】:

            【解决方案5】:

            确实,endsas; 在某些 SAS 环境中会导致无法恢复的问题,尤其是 9.4m3

            出于这个原因,在 SASjs Core 库中,我们不得不采用“开箱即用”的方法来防止进一步执行

            我们称之为“skippy”——只需打开一个(或两个)宏,不要关闭它们!

            filename skip temp;
            data _null_;
              file skip;
              put '%macro skip(); %macro skippy();';
            run;
            %inc skip;
            

            这是我们在SASjs中使用的完整宏:https://github.com/sasjs/core/blob/main/base/mp_abort.sas

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-03-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-13
              • 1970-01-01
              相关资源
              最近更新 更多