确定SAS数据集是表还是视图

时间:2018-07-11 18:39:13

标签: view sas proc-sql

给定SAS数据集的名称,我试图确定它是表还是视图。

上下文是我有一个数据步骤,在该步骤中,我遍历数据集名称的列表,并且如果数据集是表(而不是视图),我想执行对删除的sql过程的调用执行指定名称的表。就目前情况而言,该代码可以按预期工作,但是会引发几种形式的警告

  

警告:文件WORK.datasetname.DATA不存在。

这是我正在使用的代码:

data _null_;

set work.ds_list;

tbl_loc = scan(tbl_name,1,'.');
if(tbl_loc = 'WORK') then do;
    drop_string = catx(' ',
                       'proc sql; drop table',
                       tbl_name,
                       '; quit;');
    call execute (drop_string);
    put ' ** Queueing call to drop table ' tbl_name;
end;
run;

那么我如何根据数据集的名称确定它是视图还是表?

谢谢!

3 个答案:

答案 0 :(得分:2)

函数EXIST将在这里为您提供帮助。

if exist(tbl_name,'DATA') then memtype = 'TABLE'; else
if exist(tbl_name,'VIEW') then memtype = 'VIEW';

drop_statements = catx
( ' ',
  'proc sql; drop', memtype, tbl_name, '; quit;'
);

来自文档

  

语法

     

EXIST(成员名称<,成员类型<,生成>>)

     

必需参数

     

会员名

     

是字符常量,变量或表达式,用于指定   SAS库成员。如果成员名称为空或字符串为空,则   EXIST使用 LAST 系统变量的值作为成员名称。

     

可选参数

     

成员类型

     

是字符常量,变量或表达式,用于指定   SAS库成员的类型。几种常见的成员类型包括访问,   目录,数据和视图。如果您未指定成员类型,则   假定成员类型为DATA。

答案 1 :(得分:1)

而不是“创建”,而是使用SASHELP.VTABLE来确定它是VIEW还是DATA。

data temp /view=temp;
set sashelp.class;
run;

data check;
set sashelp.vtable;
where libname='WORK';
run;

请注意,这种情况下的内存类型是VIEW。您可能也可以将数据集连接到表或进行某种形式的查找,但是连接将非常简单。

然后,一旦有了数据集,就可以使用PROC DATASETS一次全部删除它们,而不是一次删除它们。您没有指出最初创建此列表的原因,但是如何创建该列表很重要,并且可能会简化很多操作。

proc datasets lib=work;
    delete temp / memtype=view;
run;quit;

答案 2 :(得分:0)

那么-您想从库中删除所有数据集,而不是视图吗?

只需使用(documenteddelete过程:

proc delete lib=work data=_all_ (memtype=data) ;
run;