导出文件时检测到打开代码语句递归

Open code statement recursion detected during exporting a file

我尝试在 SAS 中导出文件,但出现 "Open code statement recursion detected." 错误。由于我根据日期导出了多个文件,我根据提示日期定义为宏变量,因此我想使用此变量命名要导出的文件,但它不起作用。如果有人帮助我,我将不胜感激。

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; 

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

%let rep_date='01JAN2015:01:23'dt ;
%let dsname = A%sysfunc(datepart(&rep_date),monyy6);
data &dsname(compress=yes);
  set have;
run;

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

%let &mvar = &mvar;

当然,这通常不会是故意发生的(有人会这么想)。当它确实发生时,通常是两个 类 错误之一的标志。

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

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

%let mvar=mydataset
%put &mvar;

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

上述 2 也是如此 - 如果魔术字符串无法修复它,那么您可能只需要重新启动 SAS 会话。当然,你仍然需要找到那个不匹配的quote/parenthesis/etc,但是你首先需要重新启动SAS,这样你才能找到它。