获取错误:无法清除或重新分配库数据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.