代码之家  ›  专栏  ›  技术社区  ›  Rookatu

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

  •  0
  • Rookatu  · 技术社区  · 6 年前

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

    上下文是,我有一个数据步骤,在该步骤中,我遍历一个数据集名称列表,如果该数据集是一个表(而不是视图),我希望执行对SQL过程的调用执行,该过程删除指定名称的表。现在,代码按预期工作,但抛出了表单的几个警告

    警告:文件工作。DATABETNAME.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 回复  |  直到 6 年前
        1
  •  2
  •   Richard    6 年前

    功能 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库成员的类型。一些常见的成员类型包括访问, 目录、数据和视图。如果未指定成员类型,则 假定为成员类型数据。

        2
  •  1
  •   Reeza    6 年前

    与其“创建它”,不如使用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;
    
        3
  •  0
  •   Allan Bowe    6 年前

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

    只需使用( documented ) delete 程序:

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