SAS %INCLUDE 语句 - 即使出现错误也继续
SAS %INCLUDE Statement - proceed even if an error
我有一个代码告诉我文件中出现问题 a.sas
filename myfile email
to=&e_mail.
subject= "Error"
type="text/plain";
%macro errmail;
%if &syserr ne 0 %then %do;
data _null_;
file myfile;
put;
put 'ERROR';
put "&syserrortext";
put;
put "Log: \logs" ;
run;
%end;
%mend errmail;
%errmail
我在另一个文件中使用 %include 函数,但是当我在那里时:
data a;
infile "/usr/local/abc/load_file" dlm='09'x firstobs=2;
INPUT id age;
run;
PROC SORT DATA=_load_a. NODUPKEY;
BY id;
proc sql noprint;
delete from abc.my_table;
quit;
proc append BASE=abc.my_table; DATA=load_a. FORCE;
%include "/usr/local/abc/a.sas";
如果此处出现错误(在 %include 函数之前),那么我不会收到电子邮件。如果我想获取有关此函数之前的错误的信息,我可以使用 %include 函数吗?
下面是log的一部分,所以我之前出错了,include函数的部分没有做。
NOTE: 129 records were read from the infile "/usr/local/642.txt".
The minimum record length was 25.
The maximum record length was 25.
NOTE: The data set WORK.LOAD_642 has 129 observations and 3 variables.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
16 PROC SORT DATA=LOAD_&nr. NODUPKEY;
17 BY ID;
3 System SAS 08:15 Tuesday, May 10, 2016
NOTE: There were 129 observations read from the data set WORK.LOAD_642.
NOTE: 0 observations with duplicate key values were deleted.
NOTE: The data set WORK.LOAD_642 has 129 observations and 3 variables.
NOTE: PROCEDURE SORT used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
19 proc sql noprint;
20 delete from a.642_ID;
sasxdbi: dbicon: special image for SAS/Poland
sasxdbi: dbicon: special image for SAS/Poland
NOTE: 135 rows were deleted from a.642_ID.
20 ! ;
21 quit;
NOTE: PROCEDURE SQL used (Total process time):
real time 17.44 seconds
cpu time 0.08 seconds
22
23 proc append BASE=a.642_ID;
sasxdbi: dbicon: special image for SAS/Poland
23 ! DATA=LOAD_&nr. FORCE;
____
180
ERROR 180-322: Statement is not valid or it is used out of proper order.
24
25 %include "/usr/local/generic.sas";
NOTE: Statements not processed because of errors noted above.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: SAS set option OBS=0 and will continue to check statements. This might cause NOTE: No observations in data set.
NOTE: PROCEDURE APPEND used (Total process time):
real time 1.20 seconds
cpu time 0.07 seconds
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
您的 proc append 中有一个额外的半列:
proc append BASE=abc.my_table; DATA=load_a. FORCE;
应该是:
proc append BASE=abc.my_table DATA=load_a. FORCE;
请注意,&SYSERR 变量在每一步后都会重置,如所写,这只会检测紧接在 %INCLUDE 语句之前的 PROC APPEND 步骤是否发生错误。
也就是说,如日志中所示,如果 PROC APPEND 错误,它可能会使 SAS 进入 SYNTAXCHECK 模式。请参阅 SAS 设置选项 obs=0 的注释。在这种状态下,没有代码被执行,SAS 只是检查代码是否存在编译错误。
如果您想从 SYNTAXCHECK 模式中恢复,以便 SAS 继续执行错误后发生的代码,您可以在 data _null_
步骤之前将以下 OPTIONS 语句添加到您的 %ERRMAIL 宏中:
options obs=max replace nosyntaxcheck;
我有一个代码告诉我文件中出现问题 a.sas
filename myfile email
to=&e_mail.
subject= "Error"
type="text/plain";
%macro errmail;
%if &syserr ne 0 %then %do;
data _null_;
file myfile;
put;
put 'ERROR';
put "&syserrortext";
put;
put "Log: \logs" ;
run;
%end;
%mend errmail;
%errmail
我在另一个文件中使用 %include 函数,但是当我在那里时:
data a;
infile "/usr/local/abc/load_file" dlm='09'x firstobs=2;
INPUT id age;
run;
PROC SORT DATA=_load_a. NODUPKEY;
BY id;
proc sql noprint;
delete from abc.my_table;
quit;
proc append BASE=abc.my_table; DATA=load_a. FORCE;
%include "/usr/local/abc/a.sas";
如果此处出现错误(在 %include 函数之前),那么我不会收到电子邮件。如果我想获取有关此函数之前的错误的信息,我可以使用 %include 函数吗?
下面是log的一部分,所以我之前出错了,include函数的部分没有做。
NOTE: 129 records were read from the infile "/usr/local/642.txt".
The minimum record length was 25.
The maximum record length was 25.
NOTE: The data set WORK.LOAD_642 has 129 observations and 3 variables.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
16 PROC SORT DATA=LOAD_&nr. NODUPKEY;
17 BY ID;
3 System SAS 08:15 Tuesday, May 10, 2016
NOTE: There were 129 observations read from the data set WORK.LOAD_642.
NOTE: 0 observations with duplicate key values were deleted.
NOTE: The data set WORK.LOAD_642 has 129 observations and 3 variables.
NOTE: PROCEDURE SORT used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
19 proc sql noprint;
20 delete from a.642_ID;
sasxdbi: dbicon: special image for SAS/Poland
sasxdbi: dbicon: special image for SAS/Poland
NOTE: 135 rows were deleted from a.642_ID.
20 ! ;
21 quit;
NOTE: PROCEDURE SQL used (Total process time):
real time 17.44 seconds
cpu time 0.08 seconds
22
23 proc append BASE=a.642_ID;
sasxdbi: dbicon: special image for SAS/Poland
23 ! DATA=LOAD_&nr. FORCE;
____
180
ERROR 180-322: Statement is not valid or it is used out of proper order.
24
25 %include "/usr/local/generic.sas";
NOTE: Statements not processed because of errors noted above.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: SAS set option OBS=0 and will continue to check statements. This might cause NOTE: No observations in data set.
NOTE: PROCEDURE APPEND used (Total process time):
real time 1.20 seconds
cpu time 0.07 seconds
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
您的 proc append 中有一个额外的半列:
proc append BASE=abc.my_table; DATA=load_a. FORCE;
应该是:
proc append BASE=abc.my_table DATA=load_a. FORCE;
请注意,&SYSERR 变量在每一步后都会重置,如所写,这只会检测紧接在 %INCLUDE 语句之前的 PROC APPEND 步骤是否发生错误。
也就是说,如日志中所示,如果 PROC APPEND 错误,它可能会使 SAS 进入 SYNTAXCHECK 模式。请参阅 SAS 设置选项 obs=0 的注释。在这种状态下,没有代码被执行,SAS 只是检查代码是否存在编译错误。
如果您想从 SYNTAXCHECK 模式中恢复,以便 SAS 继续执行错误后发生的代码,您可以在 data _null_
步骤之前将以下 OPTIONS 语句添加到您的 %ERRMAIL 宏中:
options obs=max replace nosyntaxcheck;