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