Sas SYSERR自动宏变量

Sas SYSERR自动宏变量,sas,Sas,我在一个SAS项目中有几个程序,即程序A->程序B->。。。。我想使用宏变量在程序之间建立依赖关系 程序A将处理几个数据步骤和过程。如果程序A中的任何过程执行时出错,我想运行程序C,否则运行程序B 这似乎很棘手,因为syserr在每个步骤边界重置。如果程序A中的第一个数据步骤执行时出错,而其余步骤没有执行,那么在程序A的末尾,syserr仍然是0。一旦发生错误,我需要宏变量值不是0,并且该值可以保持到程序结束 如果程序依赖关系基于其他标准(例如值),则用户定义的宏变量可以处理该问题。对于一些与系

我在一个SAS项目中有几个程序,即程序A->程序B->。。。。我想使用宏变量在程序之间建立依赖关系

程序A将处理几个数据步骤和过程。如果程序A中的任何过程执行时出错,我想运行程序C,否则运行程序B

这似乎很棘手,因为syserr在每个步骤边界重置。如果程序A中的第一个数据步骤执行时出错,而其余步骤没有执行,那么在程序A的末尾,
syserr
仍然是
0
。一旦发生错误,我需要宏变量值不是0,并且该值可以保持到程序结束

如果程序依赖关系基于其他标准(例如值),则用户定义的宏变量可以处理该问题。对于一些与系统错误相关的问题,我认为SAS已经有了一些方法可以解决。但是除了
syserr
,我找不到任何其他方法,这似乎没有什么帮助


注意:我发现这个。但基本上是在每个数据步骤之后检查错误状态。如果程序A包含50多个数据步骤,这听起来很疯狂。

简单-只需使用
syscc

SYSCC是一个读/写自动宏变量,允许您 重置作业条件代码并从以下条件中恢复: 防止后续步骤运行

你看,但我想你会在找这样的东西:

%if &syscc > 4 %then %do;
  %inc "/mypath/pgmB.sas";
%end;
%else %do;
  %inc "/mypath/pgmA.sas";
%end;
syscc
的最大值是跨步骤边界保留的,始终使用一个整数表示错误级别。示例值:

SYSCC的值为:

  • 0没有错误,没有警告
  • 4是警告
  • 大于4表示发生错误
请注意,有些东西它无法捕捉,但为了提高它的有效性,您可以使用:

options errorcheck=strict;

最后-您提到“sas项目”,如果您的意思是您正在使用《企业指南》,请注意其中的建议。

使用一个宏,称之为runquitA。在每个proc sql或proc data的末尾调用此宏以代替quit;跑,

例如:

/*Program A*/

%macro runquitA;
  ; run; quit;
  %if &syserr. ne 0 %then %do;
     /*Call Program C*/
  %end;
%mend runquitA;

proc sql;
    create table class1 as
    select * from sashelp.class;
%runquitA;

data class2;
    set sashelp.class;
%runquitA;

/*Call Program B*/

/*end of Program A*/

您可以定义一个宏来跟踪错误状态,并在每个步骤后运行该宏。宏的外观如下所示:

%macro track_err;
  %global err_status;
  %let err_status = %sysfunc(max(&err_status, &syserr ne 0));
%mend;
%macro run_quit_track;
  run;quit;
  %global err_status;
  %let err_status = %sysfunc(max(&err_status, &syserr ne 0));
%mend;

%let err_status = 0;

data oops;
  set sashelp.doesnt_exist;
%run_quit_track;

data yay;
  set sashelp.class;
%run_quit_track;

%put &=err_status;
下面是一个使用示例。首先初始化该值以跟踪总体错误状态。第一个数据步骤将失败,第二个数据步骤将成功运行,
err\u status
的最终值将为1

%let err_status = 0;

data oops;
  set sashelp.doesnt_exist;
run;
%track_err;

data yay;
  set sashelp.class;
run;
%track_err;

%put &=err_status;
最终输出:

ERR_STATUS=1
至于“在每一步之后检查状态听起来很疯狂”。。。SAS并没有为您的确切需求提供一些东西,所以唯一的方法就是在每一步之后进行检查

EDIT:更正-看起来RawFocus的回答中提到的
syscc
方法实际上表明SAS中存在这样的功能


如果您希望检查与代码更“融合”,那么考虑用一个执行Run/Debug的宏替换您的<代码>运行< /COD>和<代码>退出< /Cord>语句,然后在一个状态下检查状态。这将导致代码稍微干净一些。大概是这样的:

%macro track_err;
  %global err_status;
  %let err_status = %sysfunc(max(&err_status, &syserr ne 0));
%mend;
%macro run_quit_track;
  run;quit;
  %global err_status;
  %let err_status = %sysfunc(max(&err_status, &syserr ne 0));
%mend;

%let err_status = 0;

data oops;
  set sashelp.doesnt_exist;
%run_quit_track;

data yay;
  set sashelp.class;
%run_quit_track;

%put &=err_status;

这并不能回答问题(因为问题明确提到了这种可能性,并要求提供更好的选择)。我认为问题是:如果出现错误,如何不继续运行程序a。如果有错误,直接运行程序C,直到结束时才运行程序A。阅读问题的最后一段。