导出文件期间检测到的打开代码语句递归

时间:2015-11-02 09:20:17

标签: recursion sas export sas-macro datastep

我尝试在SAS中导出文件但我得到了#34;检测到开放代码语句递归。"错误。由于我根据日期导出多个文件,我根据提示日期定义为宏变量,我想命名我的文件以使用此变量导出,但它不起作用。如果有人帮助我,我真的很感激。

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; 

2 个答案:

答案 0 :(得分:1)

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

---------------
|   Column 1  |
---------------
|   Column 2  |
---------------
|   Column 3  |
---------------
|   Column 4  |
---------------

答案 1 :(得分:0)

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

%let &mvar = &mvar;

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

  1. 您缺少分号,结束括号,结尾引用或其他导致SAS在%let语句末尾没有“看到”分号的内容。然后你的下一个语句在宏上下文中使用宏变量,SAS将其视为%let语句的一部分,这会导致出现此错误消息。
  2. 某处 else 出了问题,而你遇到的问题就是其他东西 - 传播错误进一步向下传播没有任何意义。拥有无与伦比的报价是一个典型的例子,因为没有正确的宏%mend
  3. 1可能发生在这样简单的情况下:

    %let mvar=mydataset
    %put &mvar;
    

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

    上面的2也是如此 - 如果魔术字符串没有修复它,那么您可能只需要重新启动SAS会话。当然,你仍然需要找到无与伦比的引用/括号/等等,但你首先需要启动SAS,这样你才能弄明白。