one more "safety vault" came into my mind, also adding:
&&dslist&n(keep=code)
would prevent "type mismatch" for other variables.
Taking all into account something like this macro wrapper:
%macro findVarVal(variable, value, type=char);
%local n len;
data _1;
&variable.=" ";
run;
data _2;
&variable.=.;
run;
proc sql noprint;
select
catx(".",libname,memname)
,max(length)
into :dslist1-,
:len
from dictionary.columns
where upcase(name) = %upcase("&variable.")
and type="&type."
;
%let n=&SQLobs;
quit;
/*
%put &=N.;
%put &=dslist1.;
%put &=dslist2.;
%put dslist&N.=&&dslist&N.;
%put &=len.;
*/
data want;
length dataset_name $ 41 &variable.
%if &type.=char %then $; &len.
;
set
%do n=1 %to &n.;
&&dslist&n.(keep=&variable.)
%end;
indsname=dsname
;
%if &type.=num %then
%do;
where &variable. = &value.;
%end;
%if &type.=char %then
%do;
where &variable. = symget('value');
%end;
dataset_name = dsname;
keep dataset_name;
run;
proc sort data=want nodupkey;
by dataset_name;
run;
%mend findVarVal;
%findVarVal(code, CM8)
%findVarVal(name, John)
%findVarVal(age, 14, type=num)
(not 100% bullet proof, but good enough)
... View more