确定 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;
我正在尝试根据 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;