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

View 确定SAS数据集是表还是视图,view,sas,proc-sql,View,Sas,Proc Sql,我试图确定,给定SAS数据集的名称,它是表还是视图 上下文是,我有一个数据步骤,在该步骤中,我迭代数据集名称列表,如果数据集是一个表(而不是一个视图),我希望执行对sql过程的调用,该过程将删除指定名称的表。现在,代码按预期工作,但会抛出一些表单警告 警告:文件WORK.datasetname.DATA不存在 以下是我正在使用的代码: data _null_; set work.ds_list; tbl_loc = scan(tbl_name,1,'.'); if(tbl_loc = 'WO

我试图确定,给定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;
那么,如何从数据集的名称确定它是视图还是表呢


谢谢

函数
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;'
);
来自文档

语法

存在(成员名称)

必需参数

成员名称

是一个字符常量、变量或表达式,用于指定 SAS图书馆成员。如果成员名称为空或空字符串,则 EXIST使用最后一个系统变量的值作为成员名称

可选参数

成员类型

是一个字符常量、变量或表达式,用于指定 SAS库成员的类型。一些常见的成员类型包括ACCESS, 目录、数据和视图。如果未指定成员类型,则 假定为成员类型数据


函数
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;'
);
来自文档

语法

存在(成员名称)

必需参数

成员名称

是一个字符常量、变量或表达式,用于指定 SAS图书馆成员。如果成员名称为空或空字符串,则 EXIST使用最后一个系统变量的值作为成员名称

可选参数

成员类型

是一个字符常量、变量或表达式,用于指定 SAS库成员的类型。一些常见的成员类型包括ACCESS, 目录、数据和视图。如果未指定成员类型,则 假定为成员类型数据


与其“创建它”,不如使用SASHELP.VTABLE来确定它是视图还是数据

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

data check;
set sashelp.vtable;
where libname='WORK';
run;
注意,本例中的memtype是VIEW。您也可以将数据集连接到表中,或者执行某种形式的查找,但是连接非常简单

一旦你有了这些数据集,你就可以使用PROC数据集一次删除它们,而不是一次删除一个。您没有指出最初是什么创建了这个列表,但是如何创建这个列表很重要,可能会简化很多

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

与其“创建它”,不如使用SASHELP.VTABLE来确定它是视图还是数据

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

data check;
set sashelp.vtable;
where libname='WORK';
run;
注意,本例中的memtype是VIEW。您也可以将数据集连接到表中,或者执行某种形式的查找,但是连接非常简单

一旦你有了这些数据集,你就可以使用PROC数据集一次删除它们,而不是一次删除一个。您没有指出最初是什么创建了这个列表,但是如何创建这个列表很重要,可能会简化很多

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

那么-您想从库中删除所有数据集,但不删除视图

只需使用()
delete
过程:

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

那么-您想从库中删除所有数据集,但不删除视图

只需使用()
delete
过程:

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

这种方法似乎对我不起作用。警告已消失,但未识别任何表:
data work.test\u data;测试_col=。;产出;跑数据为空;如果(不存在('work.test_data','TABLE')),则输入'notrecognized as TABLE';运行
在第一行中,您是否打算编写
如果存在(tbl_name,'DATA'),那么memtype='TABLE'?这种方法似乎不适合我。警告已消失,但未识别任何表:
data work.test\u data;测试_col=。;产出;跑数据为空;如果(不存在('work.test_data','TABLE')),则输入'notrecognized as TABLE';运行
在第一行中,您是否打算编写
如果存在(tbl_name,'DATA'),那么memtype='TABLE'?嗨@Reeza,我认为这种方法不可行,因为查询sashelp.vtable会挂起我的会话。也许我的环境太拥挤了?如果你有太多的桌子,这是可能的。然后可以使用PROC数据集本身创建列表。如果所有文件都在几个库或单个库中,则此方法最有效。您好@Reeza,请不要认为此方法对我是可行的,因为查询sashelp.vtable可能会挂起我的会话。也许我的环境太拥挤了?如果你有太多的桌子,这是可能的。然后可以使用PROC数据集本身创建列表。如果所有文件都在几个库或单个库中,则此方法最有效。