是否曾经遇到过 SAS 会话问题,但由于远程工作库 (RWORK) 中有关键文件而无法关闭会话?
我当然有!那么如何从另一个(新)会话访问该库?
不确定提出您知道答案的问题的道德规范,但希望其他人会发现这很有用!
%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 被擦除),并且第二个会话需要登录到同一台服务器上......
这是我编写的一个宏,用于将多个 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 ;
回应 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;