【问题标题】:SAS: getting the filesize of created DBF fileSAS:获取创建的 DBF 文件的文件大小
【发布时间】: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 访问的进程(即xsyscmd 等)。这显然包括filename(例如,请参阅this article。)所以我要么添加检查xcmd 选项的值在您的STP 服务器上,或者与您的服务器管理员交谈。
  • 嗨,乔!是的,你是对的!问题出在权限上。我将 STP 选项“服务器类型”切换为“仅限工作区服务器”并且 STP 重新处理文件大小。所以,非常感谢!
  • 很高兴听到 - 我已经把它作为答案。 (具体来说,XCMD 问题——这可能是你的不同之处。)如果它实际上与稍微不同的东西有关,你应该用更具体的方式给出你自己的答案(因为我实际上不知道“仅工作区服务器”的作用)。

标签: stored-procedures sas sas-macro


【解决方案1】:

filename() 在具有OPTION NOXCMD 的环境中受到限制,默认情况下为服务器环境设置。这是出于安全原因(XCMD 允许 shell 访问)。您可以通过启用 OPTION XCMD 来启用此功能,但您的服务器管理员(如果不是您)通常必须在服务器上启用它,而不是在本地会话中启用它。

更多信息请参见the SAS documentation on XCMD

【讨论】:

  • 我还发现文件大小可以通过更简单的指令获得:filename x '/SASInside/DBF/myfile'; proc sql; select * from dictionary.EXTFILES where Fileref='X'; quit;,无需切换服务器类型。
  • @PierreVanStulov 请将其发布为答案 - 如果它解决了您的问题,请接受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多