DATA Step, Macro, Functions and more

Can macro variables created in select into be local?

Reply
Frequent Contributor
Posts: 133

Can macro variables created in select into be local?

Can macro variables created in select into be local?

  • SELECT … INTO :mac_var1


will mac_var1 be local?

Super User
Super User
Posts: 6,500

Re: Can macro variables created in select into be local?

If you are inside of a macro AND if the macro variables have not defined before then they will be local.  But if the macro variables already existing (either global or local) then the existing macro variable will get the value.

In this example VAR1 will be GLOBAL, VAR2 will be local with scope of macro OUTER. The other macro variables will be local with scope of the macro INNER.

%let var1=global;

%macro inner;

proc sql noprint ;

  select name into :var1-:var100 from sashelp.class ;

quit;

%put _user_;

%mend inner;

%macro outer ;

  %local var2;

  %inner;

%mend outer;

%outer;



SAS Super FREQ
Posts: 8,743

Re: Can macro variables created in select into be local?


Hi:

  It sort of depends. You can run the code below and review what you see in the SAS log. The macro variable HOWOLD created out in "open code" is global in scope by default. A "local" symbol table only exists for the duration of a macro program. For example, if you are just running PROC SQL and no macro program is involved, then there is no local table, only the global table. So you couldn't put a macro variable into the local table if it doesn't exist. On the other hand, if you create a macro variable INSIDE a macro program, unless you explicitly put the macro variable into the global table, it will be local in scope. The rules of global and local scope are outlined very nicely in the macro documentation and the %GLOBAL and %LOCAL statements exist to help you declare scope if you explicitly need to. In addition, CALL SYMPUTX allows you to specify the global or local placement of a macro variable.

  cynthia

proc sql;
  select age into :howold
  from sashelp.class
  where name="Philip";
quit;
%put ---- INTO in open code, not in macro program;
%put _user_;
      
%macro findage(want=);
proc sql;
  select age into :theage
  from sashelp.class
  where name="&want";
quit;
     
%global gmvar;
%local lmvar;
data _null_;
  call symputx('gmvar','This one is GLOBAL',G);
  call symputx('lmvar','This one is LOCAL',L);
run;
      
%put _user_;
%mend findage;
  
options mlogic;
%findage(want=Philip)
  
%findage(want=Alfred)
options nomlogic;

  
%put after running macro;
%put _user_;

Valued Guide
Posts: 2,175

Re: Can macro variables created in select into be local?

not sure why I feel I have to add this , but ... since no-one has pointed it out

If your macro invokes SELECT  ....... INTO :mac_var1

then it might not be as _local_ as you expected

%macro do_it( variable, data= sashelp.class ) ;
proc sql noprint ;
select max(&variable) into :mac_&variable  from &data ;
quit ;
%put _user_ ;
%mend  do_it ;

%macro caller ;
%let mac_age = 1 ;
%do_it( age ) ;
%do_it( height ) ;
%mend  caller ;

option mprint ;

%caller
%put _user_;

macro variables mac_age and mac_height are not global

but mac_age is not local to %do_it

Ask a Question
Discussion stats
  • 3 replies
  • 4973 views
  • 0 likes
  • 4 in conversation