Using SAS Macro code often adds complexity which means you then will need to spend more time for documentation and if it ever falls over then the code will be harder to debug and maintain/change by someone else. Ask yourself if for the solution of your actual problem dynamic code is really necessary. Sometimes it's better to just type a few more lines of code.
Below a sample macro that should do what you're asking for (or at least what I understand that you're asking for).
data sample;
date='01JAN2022'd;
another_date='02JAN2022';
another_variable=72.07;
label
date='Date of Procedure is outdated'
another_date='Meaningless Text Plus Date of Zebra'
another_variable='outDATEd information';
run;
%macro change_label(ds);
%local libref table new_labels;
%let libref=%scan(work.&ds,-2,.);
%let table =%scan(&ds,-1,.);
%let new_labels=;
proc sql noprint;
select
strip(name)||' '||cats('label=',quote(prxchange('s/\b(date)\b/$1 and Time/oi',-1,trim(label))))
into :new_labels separated by ' '
from dictionary.columns
where
libname="%upcase(&libref)"
and memname="%upcase(&table)"
and findw(label,'date',' ','i')>0
;
run;
%if %nrbquote(&new_labels) ne %nrbquote() %then
%do;
proc datasets lib=&libref nolist;
modify &table;
attrib &new_labels;
%end;
%mend;
%change_label(sample);
proc contents data=work.sample;
run;quit;
... View more