给定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;
那么我如何根据数据集的名称确定它是视图还是表?
谢谢!
答案 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)
那么-您想从库中删除所有数据集,而不是视图吗?
只需使用(documented)delete
过程:
proc delete lib=work data=_all_ (memtype=data) ;
run;