获取错误:无法清除或重新分配库数据1,因为它仍在SAS中使用
这是我正在运行的代码,我不知道为什么会出现这个错误获取错误:无法清除或重新分配库数据1,因为它仍在SAS中使用,sas,sas-macro,Sas,Sas Macro,这是我正在运行的代码,我不知道为什么会出现这个错误 options symbolgen mlogic; libname lib11 '/home/userid'; %macro SFTPLoop(ds); %global numobs; %let dsid = %sysfunc(open(&ds)); %if &dsid %then %do; %let NumObs= %sysfunc(AttrN(&dsid,NObs)); %
options symbolgen mlogic;
libname lib11 '/home/userid';
%macro SFTPLoop(ds);
%global numobs;
%let dsid = %sysfunc(open(&ds));
%if &dsid %then %do;
%let NumObs= %sysfunc(AttrN(&dsid,NObs));
%If &NumObs>0 %THEN %DO;
%do %while (%sysfunc(fetch(&dsid)) = 0);
%end;
%end;
%else %put ERROR:Data set &dset has 0 rows in it.;
%let rc = %sysfunc(close(&dsid));
%end;
%else %put ERROR:open for data set &dset failed - %sysfunc(sysmsg()).;
%mend SFTPLoop;
%SFTPLoop(lib1.data);
16 libname lib1'/home/userid'
错误:无法清除或重新分配库LIB1,因为它仍在使用中。
错误:LIBNAME语句中出现错误。请尝试在新会话中运行它。另外,如果在查看器中打开了它,请确保它已关闭。确保没有其他用户或进程正在使用它 有时代码会在某个点出错,并阻止
close()
语句运行。发生这种情况时,需要手动运行close()
。在开发过程中,有时只需清除已打开的任何文件句柄即可
您可以使用如下所示的宏来执行此操作:
%macro close_all_dsid;
%local i rc;
%do i=1 %to 1000;
%let rc=%sysfunc(close(&i));
%end;
%mend;
%close_all_dsid;
编辑:我还注意到您在代码中遗漏了“肉”。如果在open()
和close()
语句之间调用其他宏,则可能会覆盖dsid
的值,因为您没有将宏变量声明为本地变量。我建议您至少申报以下内容:
%local dsid rc;
另一种解释是,可能在某个时刻,您运行了多个
open()
语句,但每次都没有运行相应的close()
。如果意外地在一行中运行了2个open()
语句,则在第一次出现时,dsid
的值将被指定为1。第二次,它将被赋值为2。如果然后运行close()
,则“2”将关闭,但“1”仍将打开。无论您运行了多少次open()
和close()
,“1”永远不会关闭,除非您手动运行close(1)
,这实际上就是我上面的代码片段所做的。我今天在尝试重新分配库时遇到了相同的错误。回顾我的日志,我看到了以下内容(在程序追加之后):
运行Robert的宏(close_all_dsid)修复了它。操作系统是在存储进程服务器会话中运行SAS 9.2的Windows 2008r2。追加成功。如果我弄明白了,我会回来的 你的代码对我来说很好。我怀疑您在SAS会话中的查看器中打开了一个数据集,该数据集来自该库或其他内容,其中包含一个表。该库是否有可能链接到自动调用宏库或类似库?感谢您的解释。你是对的,代码在遇到Close()之前出错了。
NOTE: BASE file MYLIB.MYDS.DATA set to record level control because there is at
least one other open of this file. The append process may take longer to complete.