【发布时间】:2015-08-27 11:24:20
【问题描述】:
我有 SAS 存储过程,它从 SAS 数据集 rr_udf_value 中提取 DBF 文件并找到它的大小 (F_SIZE):
filename dbfout "/SASInside/DBF/myfile";
proc export
data=rr_udf_value
outfile=dbfout
dbms=dbf
replace;
run;
%let f_nm=/SASInside/DBF/myfile.DBF;
%let rc=%sysfunc(filename(onefile, &f_nm.));
%let fid=%sysfunc(fopen(&onefile));
%let F_SIZE=%sysfunc(finfo(&fid,File Size (bytes)));
%put &F_SIZE;
问题是变量 F_SIZE 在 STP 日志中为空。但是如果在执行 STP 之后我运行命令
%let f_nm=/SASInside/DBF/myfile.DBF;
%let rc=%sysfunc(filename(onefile, &f_nm.));
%let fid=%sysfunc(fopen(&onefile));
%let F_SIZE=%sysfunc(finfo(&fid,File Size (bytes)));
%put FSIZE=&F_SIZE;
手动,一切正常:F_SIZE=17342。
为什么在运行 STP 时 F_SIZE 未初始化,我该如何解决?
提前致谢!
【问题讨论】:
-
任何警告或错误? F_SIZE 是未初始化还是空白(这些不同)?当你说手动的时候,是不是和STP在同一台服务器上运行100%肯定是相同的权限(特别是,我想知道
fopen是否需要XCMD)? -
没有警告或错误,但变量 fid=0(这意味着 fopen 在 STP 中运行时失败)。 F_SIZE 为空白。我在同一台服务器上运行该程序。 STP 成功创建 DBF 文件,所以我认为需要检查其大小的权限。我说的对吗?
-
好吧,我说的不是磁盘权限。默认情况下,服务器环境中禁止某些使用类似 shell 访问的进程(即
x、syscmd等)。这显然包括filename(例如,请参阅this article。)所以我要么添加检查xcmd选项的值在您的STP 服务器上,或者与您的服务器管理员交谈。 -
嗨,乔!是的,你是对的!问题出在权限上。我将 STP 选项“服务器类型”切换为“仅限工作区服务器”并且 STP 重新处理文件大小。所以,非常感谢!
-
很高兴听到 - 我已经把它作为答案。 (具体来说,XCMD 问题——这可能是你的不同之处。)如果它实际上与稍微不同的东西有关,你应该用更具体的方式给出你自己的答案(因为我实际上不知道“仅工作区服务器”的作用)。
标签: stored-procedures sas sas-macro