由于在SAS中误用%sysrput导致的奇怪错误

时间:2012-10-30 15:44:17

标签: sas

我正在使用带有SAS 9.1.3的AIX 6.1 我有一个在PC SAS 9.1中运行的程序 该程序将提交给unix 现在,我将程序转换为在AIX 6.1中完全运行 该程序非常奇怪地失败了 经过调查,这是由于%sysrput
以下是该计划的简化版本:

options mPrint mLogic symbolGen ; 
%macro combine( startdate= , fullprefix= );
  data _null_ ;   
       call symput( 'plength',compress(length(compress("&fullprefix."))));
  run;  
  data _null_ ;   
       length balance 8. ;  
              balance= 1 + &plength.; 
  run;  
%mEnd;  
data _null_ ;
     call symput( 'refdate', put(today(),date9.));   
run;
%put &refdate.;   
* -- If I forget to comment out the sysrput, the plength cannot be resolved -- ;
%sysrput refdate=&refdate.; 
%put &refdate.;   
%combine( startdate= "&refdate."d, fullprefix=a_filename_prefix );   

(很抱歉,这些措辞没有意义,我只是想做一个演示。)

实际上,在AIX中,我不应该使用%sysrput
我只是忘记发表评论 但是,如果我忘记了这一点,则balance =语句中的plength宏变量会出错。这很奇怪。

要解决,只需注释掉%sysrput即可。

但是,有没有人知道为什么%sysrput会导致宏中的宏变量失败?

Alvin SIU

2 个答案:

答案 0 :(得分:3)

很难从您的问题的简化版本中判断出来,但如果您在宏执行后询问为什么宏变量plength不存在,那是因为您必须将其定义为 global < / strong>在宏代码中。换句话说:

%macro combine( startdate= , fullprefix= );
%global plength;
...
%mend;

是的,如果您使用来自SAS会话不受SAS / CONNECT控制的%SYSRPUT命令,您将获得SAS错误;并且出现SAS错误会使您的非交互式会话进入“语法检查”模式,在这种情况下,程序中的其余语句将无法完全执行。

将代码从SAS / CONNECT环境转换为“普通旧SAS”时,最后一点是一个常见的误解。使用SAS / CONNECT时,连接的“服务器”端以“-NOSYNTAXCHECK”选项启动。

答案 1 :(得分:-1)

经过一些小测试后调查。也许这就是答案。

实际上,我会在所有批处理SAS程序中使用OPTIONS ERRORABEND来在发生错误时停止SAS。这很好地适用于许多错误和功能。

%SYSRPUT语句确实发出错误消息,说明...选项DMR ...
但该计划并未在此停止。
它没有给出任何消息说...... OBS = 0 ...
它继续下去。 所以,我只是'认为'这是一个小错误,就像LIBNAME一个不存在的目录一样,SAS将继续“正常”。
(顺便说一下,我认为SYSRPUT错误已经静默打开SYNTAX CHECK模式,没有任何通知也没有提示。)

下一个%PUT语句是正常的,与前一个语句相同 这误导了程序运行正常。

接下来的陈述也很正常。有许多SYMBOLGEN,MPRINT和MLOGIC信息 所以,这进一步误导了我,程序运行非常正常。

在调用symput plength语句之后,有一个注意:数字值已被转换...
这进一步误导我程序正常运行。

直到现在(经过如此多的看似正常的消息之后),有一个注释说SAS设置选项OBS = 0 ...
(也许这个NOTE只会在RUN语句之后出现。)

此OBS = 0消息实际上是告诉SAS使用SYNTAX CHECK模式的提示 也许这个OBS = 0是由SYSRPUT错误引起的。但是,因为在SYSRPUT错误之后有如此多的看似正常的消息,我只是忽略了这个OBS = 0消息。
实际上,电话会议很简单,不应该引起任何错误 这使情况进一步复杂化。

由于SAS处于SYNTAX CHECK模式,这就是在balance语句中导致plength变量出现类似错误的原因。

这是整个故事。

无论如何,为了防止进入这种复杂和误导的情况,只需记住注释掉所有%SYSRPUT会做的。