动态重命名SAS数据集时出错

时间:2018-10-11 19:29:00

标签: sas dataset

背景

我有一个脚本,每个月运行一次,以创建供团队使用的数据集。该脚本在我的个人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数据集中使用“ exchange”功能。但是,我想知道上述错误是否有解决方案。

3 个答案:

答案 0 :(得分:0)

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

包括:

  • LOCK名成员
  • 按客户端(EG)设置保持打开状态
  • 打开时出现错误,未检查open函数

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

您能不能进入Unix主机并向list lockers发出命令?诸如flock lslocklslklsof

之类的命令

答案 1 :(得分:0)

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

%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;

答案 2 :(得分:0)

好吧,我迷路了。从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;