如何在SAS宏中为多个PROC SQL启用返回码检查以终止后续执行
在SAS宏中实现PROC SQL的返回码检查与终止逻辑
方法1:用&SYSERR自动变量+条件判断终止宏
SAS自带的&SYSERR宏变量会记录最近一次SAS步骤的执行状态:0代表执行成功,非0则表示出现错误。在每个PROC SQL执行完毕后,立刻检查这个变量的值,一旦发现非0就终止后续代码。
示例代码:
%macro run_sql_sequential(); /* 第一个PROC SQL任务 */ proc sql; create table table1 as select * from sashelp.class where age > 12; quit; /* 检查执行状态 */ %if &syserr ne 0 %then %do; %put ERROR: 第一个PROC SQL执行失败,终止后续操作; %abort cancel; /* 终止当前宏,不退出SAS会话 */ %end; /* 第二个PROC SQL任务 */ proc sql; create table table2 as select * from table1 where sex = 'M'; quit; %if &syserr ne 0 %then %do; %put ERROR: 第二个PROC SQL执行失败,终止后续操作; %abort cancel; %end; /* 第三个PROC SQL任务 */ proc sql; create table table3 as select name, age from table2; quit; %if &syserr ne 0 %then %do; %put ERROR: 第三个PROC SQL执行失败,终止后续操作; %abort cancel; %end; %mend run_sql_sequential(); %run_sql_sequential();
如果需要直接退出SAS会话,把%abort cancel换成%abort abend即可。
方法2:封装检查逻辑为子宏,减少重复代码
如果多个PROC SQL都要做相同的检查,可以把检查逻辑写成一个子宏,主宏里直接调用,让代码更简洁。
示例代码:
/* 封装返回码检查的子宏 */ %macro check_rc(step_desc); %if &syserr ne 0 %then %do; %put ERROR: &step_desc执行失败,终止宏; %abort cancel; %end; %mend check_rc; %macro run_sql_sequential(); proc sql; create table table1 as select * from sashelp.class where age > 12; quit; %check_rc(第一个PROC SQL); proc sql; create table table2 as select * from table1 where sex = 'M'; quit; %check_rc(第二个PROC SQL); proc sql; create table table3 as select name, age from table2; quit; %check_rc(第三个PROC SQL); %mend run_sql_sequential(); %run_sql_sequential();
额外提示
&SYSERR会被后续的SAS步骤覆盖,所以必须在每个PROC SQL执行完立刻检查,不能等后面的步骤执行后再回头看。- 如果需要捕获警告(比如数据截断这类不触发错误但有风险的情况),可以结合
&SYSWARNINGCOUNT变量,判断是否有警告产生后再决定是否终止。
内容的提问来源于stack exchange,提问作者Navin
相关产品推荐
相关产品推荐

