作为一个更广泛的问题,OPEN STATEMENT RECURSION DETECTED
是指将宏变量分配给自身的情况。
%let &mvar = &mvar;
当然,这通常不会故意发生(人们会认为)。当它确实发生时,通常是两种错误之一的迹象。
- 您缺少分号、结束括号、结束引号或其他导致 SAS 无法“看到”
%let
语句末尾的分号的内容。然后,您的下一条语句在宏上下文中使用宏变量,SAS 将其视为%let
语句的一部分,这会导致此错误消息。
- 其他地方出了点问题,并且您遇到了一个问题,即其他地方会进一步传播没有任何意义的错误。有一个不匹配的引用是一个典型的例子,一个不正确的宏也是
%mend
。
1 可能发生在这样简单的情况下:
%let mvar=mydataset
%put &mvar;
哎呀。如果就这么简单,那么只需弹出分号就可以了。但是,它可能是由更重要的事情引起的 - 例如不匹配的括号或引号 - 这可能需要重新启动您的 SAS 会话。(有时提交 a magic string
,这是 的变体%*;*;*';*";%*%mend;*);
,会解决问题,有时不会。重新启动 SAS 是解决该问题的可靠方法)。
上面的 2 也是如此 - 如果魔术字符串无法修复它,那么您可能只需要重新启动 SAS 会话。当然,您仍然需要找到不匹配的引号/括号/等,但您首先需要重新启动 SAS 以便您弄清楚。