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

QQ今天看到一个群友(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;

结果如下: UDF

曾宪华 /
本文采用 署名-非商业性使用-相同方式共享 3.0许可协议 属于 程序人生 分类, 被贴了 PROC FCMP 自定义函数 书签

上一篇 SAS中产生笛卡尔积的几种方法
下一篇 Annotate Facility之森林图