2

我尝试在 SAS 中导出文件,但出现“检测到打开代码语句递归”。错误。由于我根据日期导出多个文件,因此我根据提示日期定义为宏变量,因此我想将我的文件命名为使用此变量导出,但它不起作用。如果有人帮助我,我将不胜感激。

rep_date = 30APR2015:00:00:00
 Outfile = work.A042015.sas7

%let var = CATS("A",MONTH(DATEPART(&rep_date)),YEAR(DATEPART(&rep_date)));
data WORK.&var(compress=yes); 
set WORK.have;
run; 
4

2 回答 2

2

宏变量只是字符串。因此,如果要在宏代码中执行函数,则需要将函数包装在 %SYSFUNC() 宏函数中。

%let rep_date='01JAN2015:01:23'dt ;
%let dsname = A%sysfunc(datepart(&rep_date),monyy6);
data &dsname(compress=yes);
  set have;
run;
于 2015-11-02T12:38:34.007 回答
2

作为一个更广泛的问题,OPEN STATEMENT RECURSION DETECTED是指将宏变量分配给自身的情况。

%let &mvar = &mvar;

当然,这通常不会故意发生(人们会认为)。当它确实发生时,通常是两种错误之一的迹象。

  1. 您缺少分号、结束括号、结束引号或其他导致 SAS 无法“看到”%let语句末尾的分号的内容。然后,您的下一条语句在宏上下文中使用宏变量,SAS 将其视为%let语句的一部分,这会导致此错误消息。
  2. 其他地方出了点问题,并且您遇到了一个问题,即其他地方会进一步传播没有任何意义的错误。有一个不匹配的引用是一个典型的例子,一个不正确的宏也是%mend

1 可能发生在这样简单的情况下:

%let mvar=mydataset
%put &mvar;

哎呀。如果就这么简单,那么只需弹出分号就可以了。但是,它可能是由更重要的事情引起的 - 例如不匹配的括号或引号 - 这可能需要重新启动您的 SAS 会话。(有时提交 a magic string,这是 的变体%*;*;*';*";%*%mend;*);,会解决问题,有时不会。重新启动 SAS 是解决该问题的可靠方法)。

上面的 2 也是如此 - 如果魔术字符串无法修复它,那么您可能只需要重新启动 SAS 会话。当然,您仍然需要找到不匹配的引号/括号/等,但您首先需要重新启动 SAS 以便您弄清楚。

于 2015-11-02T16:16:34.340 回答