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

Determine whether a SAS dataset is a table or view

我正在尝试根据 SAS 数据集的名称来确定它是 table 还是视图。

上下文是我有一个数据步骤,我在其中迭代数据集名称列表,如果数据集是 table(而不是视图),我想执行调用执行到 sql 过程,该过程删除指定名称的 table。就目前而言,代码按预期工作,但会抛出几个形式为

的警告

WARNING: File WORK.datasetname.DATA does not exist.

这是我使用的代码:

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;

那么如何根据数据集的名称来判断它是视图还是table?

谢谢!

函数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;'
);

来自文档

Syntax

EXIST(member-name <, member-type <, generation>>)

Required Argument

member-name

is a character constant, variable, or expression that specifies the SAS library member. If member-name is blank or a null string, then EXIST uses the value of the LAST system variable as the member name.

Optional Arguments

member-type

is a character constant, variable, or expression that specifies the type of SAS library member. A few common member types include ACCESS, CATALOG, DATA, and VIEW. If you do not specify a member-type, then the member type DATA is assumed.

而不是 'create it' 使用 SASHELP.VTABLE 来确定它是 VIEW 还是 DATA。

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

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

请注意,本例中的 memtype 是 VIEW。您也可以将数据集加入 table 或进行某种形式的查找,但加入会非常简单。

然后一旦你有了数据集,你就可以使用 PROC DATASETS 一次删除它们而不是一次一个。您没有指出最初创建此列表的内容,但该列表的创建方式很重要,并且可能会大大简化此过程。

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

所以 - 您想要从库中删除所有数据集,但不删除视图?

只需使用 (documented) delete 程序:

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