【问题标题】:Error while dynamically renaming SAS Dataset动态重命名 SAS 数据集时出错
【发布时间】:2019-03-16 23:30:56
【问题描述】:

背景

我有一个每月运行的脚本,用于创建我的团队使用的数据集。该脚本在我的个人 UNIX 目录中生成数据集,然后我运行完整性检查并将数据集复制到我的团队可以访问的“公共”目录中。该脚本很稳定,因此无需再运行健全性检查。

我想做什么

  • 从公用文件夹的先前版本的数据集中提取上次修改日期(工作正常)
  • 用修改后的数据集名称更新 日期(面临问题)
  • 将新创建的数据集移动/复制到公用文件夹(工作正常)

问题说明

尝试更改数据集名称时出现以下错误

错误:您无法将 COSTDATA.EMPL_CHAIN.DATA 重命名为 COSTDATA.EMPL_CHAIN_19SEP18.DATA,因为您在资源环境 IOM ROOT COMP ENV 中正在使用 COSTDATA.EMPL_CHAIN.DATA。

使用的代码

%let dsid2=%sysfunc(open(costdata.empl_chain));
%put ********&dsid2;
%let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
%put &modte2;
%let rc=%sysfunc(close(&dsid2));
%put RC Value is &rc;

proc datasets library=costdata;
change empl_chain=empl_chain_&modte2;
run;

SAS 日志

29         %let dsid2=%sysfunc(open(costdata.empl_chain));
30         %put ********&dsid2;
********2
31         %let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
32         %put &modte2;
19SEP18
33         %let rc=%sysfunc(close(&dsid2));
34         %put RC Value is &rc;
RC Value is 0
35         


36         proc datasets library=costdata;
37         change empl_chain=empl_chain_&modte2;
38         run;

NOTE: Changing the name COSTDATA.EMPL_CHAIN to COSTDATA.EMPL_CHAIN_19SEP18 (memtype=DATA).
ERROR: You cannot rename COSTDATA.EMPL_CHAIN.DATA to COSTDATA.EMPL_CHAIN_19SEP18.DATA because COSTDATA.EMPL_CHAIN.DATA is in use by you in resource environment IOM ROOT COMP ENV.
39

其他有用信息:

我正在尝试对多个数据集执行类似的操作。如果 SAS EG 会话是新的,则重命名片段适用于第一个数据集。对于第二个数据集,它可以预见地失败。在 EG 中,工具 > 选项 > 数据 > 数据常规...按照 SAS 的建议,“添加到项目时自动打开数据”复选框处于未选中状态。

我还知道其他简单的技巧,例如在新数据步骤中声明具有正确名称的新数据集或在 proc 数据集中使用“交换”函数。不过我想知道,如果有任何解决上述错误的方法。

【问题讨论】:

  • 您之前是否收到任何错误?当我尝试运行您的代码时,我会这样做。

标签: sas dataset


【解决方案1】:

https://communities.sas.com/t5/SAS-Programming/sysfunc-open-causes-table-to-be-locked-if-error-occurs/td-p/57601讨论一系列原因

包括:

  • LOCKed 成员
  • 由客户端 (EG) 设置保持打开
  • 打开时出现错误且未检查 open 函数

第二次%sysfunc(open 尝试和%sysfunc(sysmsg()) 返回的dsid 是什么?

您可以通过 ssh 进入您的 Unix 主机并向list lockers 发出命令吗? flocklslocklslklsof等命令

【讨论】:

    【解决方案2】:

    另一种方法是通过另一种方式获取修改日期。

    %let dset = CLASS;
    
    proc sql noprint;
    select put(datepart(modate), yymmddn8.) into :modte
    from sashelp.vtable
    where libname='WORK' and memname="&dset.";
    quit;
    
    %put &modte.;
    
    
    proc datasets library=work;
    change &dset. = &dset._&modte.;
    run;
    

    【讨论】:

      【解决方案3】:

      好吧,我迷路了。从 EG 7.15 到 Linux 上的 SAS 9.4M4 会话,您的代码对我来说运行良好。下面是一个使用 WORK 库的示例。您能否使用查看这是否会在您的环境中重现问题,如果没有,您能否发布使用从 SASHELP 数据集创建的数据重现问题的完整代码?

      从您共享的日志看来,所有返回代码都不错,因此 SAS 代码不应锁定文件。一旦你有一个可重现的例子,也许可以尝试在服务器上批量提交它(假设你可以通过 ssh 访问),看看 EG 是否以某种方式导致了锁定。

      data class ;
        set sashelp.class ;
      run ;
      
      data shoes ;
        set sashelp.shoes ;
      run ;
      
      %let dsid2=%sysfunc(open(work.class));
      %put ********&dsid2;
      %let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
      %put &modte2;
      %let rc=%sysfunc(close(&dsid2));
      %put RC Value is &rc;
      
      proc datasets library=work;
      change class=class_&modte2;
      run;
      
      %let dsid2=%sysfunc(open(work.shoes));
      %put ********&dsid2;
      %let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
      %put &modte2;
      %let rc=%sysfunc(close(&dsid2));
      %put RC Value is &rc;
      
      proc datasets library=work;
      change shoes=shoes_&modte2;
      run;
      

      【讨论】:

      • 我无法使用 sashelp 数据集重新创建问题。类似行的代码工作得很好。我的信念是,这些数据集正在被其他一些程序(如 spotfire)使用。我想我需要使用 proc 数据集“Exchange”重写。 Exchange 将允许在数据集被其他程序使用时对其进行修改。
      • 同意外部进程(例如备份或病毒扫描)可能导致文件锁定。如果是这样的话,我认为 EXCHANGE 不会有任何帮助。它可能与两个 RENAME 做同样的事情。
      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多