Recursion 导出文件期间检测到Open code语句递归

Recursion 导出文件期间检测到Open code语句递归,recursion,sas,export,sas-macro,datastep,Recursion,Sas,Export,Sas Macro,Datastep,我试图在SAS中导出一个文件,但我得到“检测到开放代码语句递归”。错误。由于根据我定义为基于提示日期的宏变量的日期导出多个文件,因此我希望使用此变量命名要导出的文件,但该变量不起作用。如果有人能帮助我,我将不胜感激 rep_date = 30APR2015:00:00:00 Outfile = work.A042015.sas7 %let var = CATS("A",MONTH(DATEPART(&rep_date)),YEAR(DATEPART(&rep_date)));

我试图在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; 

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

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

作为一个更广泛的问题,
检测到的开放语句递归
指的是将宏变量分配给自身的情况

%let &mvar = &mvar;
当然,这通常不是故意的(人们会认为)。当它真的发生时,通常是两类错误之一的征兆

  • 您缺少分号、结束括号、结束引号或其他导致SAS无法在
    %let
    语句末尾“看到”分号的内容。然后,您的下一条语句在宏上下文中使用宏变量,SAS将其视为
    %let
    语句的一部分,这会导致此错误消息
  • 在其他地方出了问题,您遇到了一个问题,即其他东西会进一步传播错误,这是毫无意义的。有一个不匹配的引号是一个典型的例子,宏不能正确地
    %mend
  • 1在如下简单的情况下可能发生:

    %let mvar=mydataset
    %put &mvar;
    
    哎呀。如果是这么简单的话,只要弹出分号就行了。但是,它可能是由一些更重要的原因引起的,例如不匹配的括号或引号,这可能需要重新启动SAS会话。(有时提交
    魔术字符串
    ,这是
    %*;*;*';*“;%*%mend;*);
    的变体,可以解决问题,有时则不能。重新启动SAS是解决问题的可靠方法)


    上述第2条也是如此-如果一个神奇的字符串不能修复它,那么您可能只需要重新启动SAS会话。当然,您仍然需要找到不匹配的引号/括号/等,但您首先需要重新启动SAS,以便您能够找到它。

    因此,如果宏变量是指定的,那么您需要将其引用为
    ”&报告日期“dt
    让SAS将其解释为日期时间文字,而不是随机的字母和数字流。此外,SAS中的数据集引用不能有三个级别。您可以参考
    WORK.A042015
    或仅
    A042015
    。此外,我还将颠倒年份和月份的顺序,以便在按词汇排序时,数据集名称将按时间顺序显示。SAS在为SAS数据集生成的物理文件中使用的文件扩展名也是“sas7bdat”。