今天看到一个群友(QQ群:144839730,加群请扫上面的二维码)提的一个问题:SAS有无一个函数将某LIBNAME下表名都取出?这个问题用字典数据表或者视图(DICTIONARY Tables and SASHELP Views)可以轻松解决。如获取逻辑库SASHELP下所有表名,代码如下:
proc sql noprint;
select MEMNAME into :tnames separated by ', '
from dictionary.tables
where libname='SASHELP'
;
select MEMNAME into :tnames separated by ', '
from sashelp.vtable
where libname='SASHELP'
;
quit;
但是群友的问题是有没有现成的函数,即类似下面这样的用法:
data _null_;
TNAMES=get_tnames('SASHELP');
run;
而我们知道当前在SAS中并没有这种功能的函数。好在SAS 9.2版本中的PROC FCMP允许用户编写个性化的函数并可在DATA步使用(SAS 9.1.3中用户自定义函数只能在某些过程步中使用)。代码如下:
%macro get_tnames();
proc sql noprint;
select MEMNAME into :tnames separated by ', '
from dictionary.tables
where libname=&lib
;
quit;
%mend get_tnames;
proc fcmp outlib=work.functions.demo;
function get_tnames(LIB $) $;
length TNAMES $ 32767;
rc=run_macro('get_tnames', LIB, TNAMES);
return(TNAMES);
endsub;
run;
options cmplib=work.functions;
data demo;
TNAMES=get_tnames('SASHELP');
run;