Behavior difference on SAS Macro (SAS v8.2 VS SAS v9.2)

From sasCommunity
Jump to: navigation, search

You may try executing the following sample programs on different SAS version. The result(Output value of Continue) from SAS v8.2 and SAS v9.2 is totally different.

   %macro LocalInit();
     %global Continue SameYear Empty;
     %let Continue=N;
     %let SameYear=Y;
     %let Empty=N;
   %mend;
 
   %macro SetContinueY();
     %let Return=Y;
     data _null_;
       ans=upcase(symget('Return'));       
       if ans = "Y" then
         call symput('Continue','Y');
     run;
   %mend SetContinueY;
 
   %macro Main();
     %LocalInit;
      %if &Empty=N and &SameYear=Y %then
       %SetContinueY;
      %end;
     %put Continue=&Continue;	 
   %mend;
   %Main;

(Output result: Continue=Y from SAS v8.2; Continue=N from SAS v9.2)

Any comments? Is it a bug in SAS v9.2?


When I run this macro code in SAS 9.3, I get a syntax error message after the %END macro statement in the Main macro, which states:
ERROR: There is no matching %DO statement for the %END. This statement will be ignored.
Adding a %DO macro statement after %then results in Continue=Y appearing in the log.
Perhaps the issue is that SAS v8.2 did not detect the syntax error of a missing %DO; statement, (or it wasn't required after the %then keyword), and this defect has now been corrected in SAS v9.2 and later. The revised Main macro code is
  %macro Main();
    %LocalInit;
     %if &Empty=N and &SameYear=Y %then 
     %do; 
      %SetContinueY;
     %end;
    %put Continue=&Continue;	 
  %mend;
Perhaps this is an example of a bug in SAS v8.2 that is fixed in SAS v9.2! Or else SAS v9.2 has a stricter syntax check and is less tolerant of miscoding. - Cameron (talk) 20:22, 29 March 2015 (CDT)