OK, I admit this is a pretty ancient thread but I've just had an issue with damaged datasets on a server that ran out of diskspace. I've been trying to answer a very similar question - How can you test programmatically if a dataset is damaged and was surprised how little information there is out there.
My solution is to use the open() function and then check the sysmsg() for the word 'damaged'. The open() function does not automatically put an error into the log (it puts a note), which meets the original requirement. Here's the macro I've knocked up. I've chosen to output the sysmsg() so I get the error, but it could be done silently. Not sure I want to attempt to repair everything so I've made that optional and I'll probably scan first to see what it finds. Ideally it would record if a repair was successful - not sure if you can get the success of the repair from proc datasets, sysrc may be useful but the definition of 'successful' is open to interpretation - for instance most of the repairs I've seen indicate some data loss.
%macro checkAndRepair(dsn, repair=N);
%local dsid msg;
%if %sysfunc(exist(&dsn.)) = 0 %then %put WARNING: &dsn does not exist.;
%else %do;
%let dsid=%sysfunc(open(&dsn.,i,,D));
%if (&dsid=0) %then %do;
%let msg=%sysfunc(sysmsg());
%put &msg.;
%if %index(&msg.,damaged) gt 0 %then %do;
%if &repair. = Y %then %do;
%put Attempting to fix...;
proc datasets nolist lib=%scan(&dsn,1,.);
repair %scan(&dsn,2,.);
quit;
%end;
%end;
%end; %else
%put NOTE: &dsn. opened succesfully.;
%let dsid=%sysfunc(close(&dsid));
%end;
%mend;
... View more