Hi kdt, 6 years later but it may be useful to others.
If you want to use a macro to return a value to a datastep you can do that:
%macro retval;
%let retval=Barbara;
&retval.
%mend retval;
data tmp;
set sashelp.class;
where name="%retval";
%put "%retval";
run;
You can also use a macro to return a value to a macro:
%macro retval;
%let retval=Barbara;
&retval.
%mend retval;
%macro useretval;
%let newretval=%retval;
%put &newretval.;
%mend;
%useretval;
You can also use a macro as a datastep function, but be mindful not to use any macro assignments, i.e. anything with a %:
%macro retval;
*The macro is resolved before the code is send to the datastep compiler;
Barbara;
%mend retval;
data tmp;
set sashelp.class;
where name="%retval";
run;
or a combination of stangeties:
%macro retval(passval, ageval, retval);
*The macro is resolved before the code is send to the datastep compiler;
if &passval=1 then retval="Mrs. Owen";
if &ageval=14 then grade9='Y';
%mend retval;
data tmp;
set sashelp.class;
%retval(1, age, teachername);
run;
However always remember as you stated above, that the macro processor first resolved any variables. So if you want to use it in a datastep/proc, make sure that it is plaintext that will be inserted into the datastep/proc.
In your example abovce, it effectively tried to insert the proc sql into the datastep.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Need courses to help you with SAS Life Sciences Analytics Framework, SAS Health Cohort Builder, or other topics? Check out the Health and Life Sciences learning path for all of the offerings.