Yikes! Here's a little something that seems quite obvious, but had never really occured to me. The other day I was talking to another programmer from businessresearchers.com about getting SAS to stop if there is an ERROR when running in batch mode. We don't want the SAS session to abort, just stop processing the code.
If you run something like the following in batch mode you might be a bit surprised at the results:
data junk;
do i = 1 to 10;
output;
end;
run;
* purposeful error in this libname and data step;
libname s "sdfasdfjsadf/";
data junk2;
set s.something;
run;
* SAS will now set obs=0 and go into "syntax check mode"
whatever that's supposed to mean...;
* but look what happens here;
proc sql;
insert into junk
set i = 11;
quit;
So SAS sets obs=0 and enters syntax check mode,
but the SQL insert still executes. I am pretty sure SQL insert, update and delete will all be executed. It makes sense if you consider that obs=0 is an option that affects input not output; ie, it limits the observations being read into a step not being output. But still, it's a little counter-intuitive that "syntax check mode" would even allow a step to execute at all...
As far as I know, the only real way around this is to wrap your code in a macro and check the value of &SYSERR before any steps you DEFINETLY do not want executed if there is an error. Could this be another opportunity to use %GOTO?
Can you not just use the statement:
ReplyDeleteoptions errorabend;
Or did I miss the point of what you want to do?
You are correct James. This is _exactly_ the time you would want to use options errorabend.
ReplyDeleteUnfortunately, we didn't want the SAS session to actually ABORT. It's been a while, but I think it was part of a complex MPconnect, and if there was an error we wanted the parent process to kill it nicely. Unfortunately for that type of scenario errorAbend doesn't work.
Thanks for the comment! -s