正确结束SAS存储过程

问题描述 投票:2回答:5

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

我有一个makro解决方案到目前为止工作正常:

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

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

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

我知道有一些编程方式,比如if-else或goto而不是停止进程,但这不是我特定问题的选项。

所以问题是:

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

sas
5个回答
0
投票

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


0
投票

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

options obs=0 noreplace;

可以作为代理。


0
投票

你可以做if else方法来防止额外的代码运行并打印自定义消息错误

%if &data ne "" %then;
   *your code;

%else
  data _null_;
   file _webout;
    put 'html code of custom message';
  run;

0
投票

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条件。


0
投票

以下是在不引发前端错误的情况下中止stp会话的唯一方法:

data _null_;
  rc = stpsrvset('program error', 0);
run;
endsas;

你必须使用endsas。如果这导致问题,那么尝试将max clients设置为1(或调整每个客户端的成本,这样每个服务器/多桥连接只有一个客户端)。这样,停止父进程/会话就不会有问题(如果确实发生了这种情况)。

或者,您需要设计错误处理,以便通过所有父宏安静地启用%return

这是我使用的宏:https://github.com/Boemska/macrocore/blob/master/base/mf_abort.sas

© www.soinside.com 2019 - 2024. All rights reserved.