My goal is to create 20 lists containing the names that have a specified value in their name, e.g.
dog_list for field names named, e.g., dog_breed dog_age dog_weight
vet_list for field names named, e.g., vet_city vet_name
and so on..
So I tried this:
%macro test (val) ;
proc sql ;
select name into :&val._list separated by " "
from dictionary.columns where libname = "WORK" and memname = "TEST" and
name contains "&val." ;
quit ;
%mend ;
%test(dog) ;
%put &dog_list ;And I got the warning: "Apparent symbolic reference DOG_LIST not resolved."
Is the issue here that &val._list resolves after the into statement creates &val._list as a macro variable? I'm really not sure how to resolve this.
I could just write this out in 20 select statements, but I feel like there's some big concept I'm missing.
A macro variable defined within a macro gets per default a scope of local. You need to use a %global statement to also use this macro variable outside of the macro.
data test;
array createVars {*} dog_breed dog_age dog_weight vet_city vet_name;
stop;
run;
%macro test (val);
%global &val._list;
proc sql;
select name into :&val._list separated by " "
from dictionary.columns where libname = "WORK" and memname = "TEST" and
upcase(name) contains "%upcase(&val.)";
quit;
%mend;
%test(dog);
%put &dog_list;
You also need to upcase the names for the where clause to filter the data case insensitive.
A macro variable defined within a macro gets per default a scope of local. You need to use a %global statement to also use this macro variable outside of the macro.
data test;
array createVars {*} dog_breed dog_age dog_weight vet_city vet_name;
stop;
run;
%macro test (val);
%global &val._list;
proc sql;
select name into :&val._list separated by " "
from dictionary.columns where libname = "WORK" and memname = "TEST" and
upcase(name) contains "%upcase(&val.)";
quit;
%mend;
%test(dog);
%put &dog_list;
You also need to upcase the names for the where clause to filter the data case insensitive.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and save with the early bird rate—just $795!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.