SAS自定义函数获取某逻辑库下所有表名

2020-07-16 10:06:03 浏览数 (1)

今天看到一个群友提的一个问题:SAS有无一个函数将某LIBNAME下表名都取出?这个问题用字典数据表或者视图(DICTIONARY Tables and SASHELP Views)可以轻松解决。如获取逻辑库SASHELP下所有表名,代码如下:

代码语言:javascript复制
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;

但是群友的问题是有没有现成的函数,即类似下面这样的用法:

代码语言:javascript复制
data _null_;
    TNAMES=get_tnames('SASHELP');
run;

而我们知道当前在SAS中并没有这种功能的函数。好在SAS 9.2版本中的PROC FCMP允许用户编写个性化的函数并可在DATA步使用(SAS 9.1.3中用户自定义函数只能在某些过程步中使用)。代码如下:

代码语言:javascript复制
%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;

结果如下:

sas

0 人点赞