2

是否曾经遇到过 SAS 会话问题,但由于远程工作库 (RWORK) 中有关键文件而无法关闭会话?

我当然有!那么如何从另一个(新)会话访问该库?

4

3 回答 3

2

不确定提出您知道答案的问题的道德规范,但希望其他人会发现这很有用!

%macro serverpath;
%put NOTE:; %put NOTE-; %put NOTE-; 
%put NOTE- libname OldWork "%sysfunc(pathname(RWORK))" server= remote %str(;);
%put NOTE- rsubmit%str(;);
%put NOTE- libname OldWork "%sysfunc(pathname(RWORK))"%str(;);
%mend; %serverpath;

这会将您需要的代码放入日志中。您可能需要更改的部分是 server= 选项 - 这应该是您登录的环境的名称(不确定如何以编程方式引用它 - 其他人知道吗?)

显然,原始会话需要保持打开状态(以防止 RWORK 被擦除),并且第二个会话需要登录到同一台服务器上......

于 2009-07-29T10:40:42.300 回答
2

这是我编写的一个宏,用于将多个 libref 分配给您拥有的所有远程工作目录:

提交;

%MACRO DOUBLELIB(USER=&SYSUSERID,LIB=double) / des="为同一用户的多个 SAS 会话分配 double 的 libname";

 选项 nosymbolgen nomprint ;

 %LET WRK = %SYSFUNC(路径名(工作));
 %LET WRKDIR = %SYSFUNC(scan(&WRK,-1,/)) ;
 %LET SASTEMP = %SYSFUNC(tranwrd(&WRK,&WRKDIR,)) ;

 文件名 mywork 管道 "ls -ls &SASTEMP" ;
 数据zwork;
   infile mywork lrecl=512 recfm=v pad ;
   输入@1 个字符 $512。;
   if index(upcase(char),upcase("&USER")) and ^index(char,scan("&WRK",-1,'/')) and index(char,'SAS_work');
   路径=扫描(字符,-1,'');
   n + 1 ;
   调用 symput('PATH'||compress(n),"&SASTEMP"||strip(path)) ;
   调用 symput('PATHN',compress(n)) ;
 跑 ;

 %NOBS(zwork) ;
 %IF &NOBS > 0 %THEN %DO ;
   库名 &LIB (
     %DO I = 1 %TO &PATHN ;
       “&&路径&我”
     %结尾 ;
   ) 访问=只读;
 %结尾 ;
 选项 symbolgen mprint ;
%修补双重标准;

%DOUBLELIB(LIB=dblwork) ;

结束提交;

/* 将本地 libref 分配给新的远程 dblwork libref */
libname rdouble slibref=dblwork server=myserver ;
于 2009-07-29T11:03:21.293 回答
2

回应 Chris J 的回应 - 缺少宏..

rsubmit ;
%macro nobs(dsn);
%local dsnid rc;
%global nobs;
%let nobs=.;
%* open the data set of interest ;
%let dsnid=%sysfunc(open(&dsn));
%* If the open was successful get the nobs and CLOSE &dsn ;
%if &dsnid %then %do;
    %let nobs=%sysfunc(attrn(&dsnid,nlobs)); 
    %let rc =%sysfunc(close(&dsnid));
%end; %else %do; 
    %put WARNING:  Unable to open &dsn - %sysfunc(sysmsg());
    %let nobs=0;
%end;  %mend nobs;
endrsubmit;
于 2009-07-29T14:16:08.813 回答