Recursion 导出文件期间检测到Open code语句递归
我试图在SAS中导出一个文件,但我得到“检测到开放代码语句递归”。错误。由于根据我定义为基于提示日期的宏变量的日期导出多个文件,因此我希望使用此变量命名要导出的文件,但该变量不起作用。如果有人能帮助我,我将不胜感激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)));
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;
当然,这通常不是故意的(人们会认为)。当它真的发生时,通常是两类错误之一的征兆
%let
语句末尾“看到”分号的内容。然后,您的下一条语句在宏上下文中使用宏变量,SAS将其视为%let
语句的一部分,这会导致此错误消息%mend
%let mvar=mydataset
%put &mvar;
哎呀。如果是这么简单的话,只要弹出分号就行了。但是,它可能是由一些更重要的原因引起的,例如不匹配的括号或引号,这可能需要重新启动SAS会话。(有时提交魔术字符串
,这是%*;*;*';*“;%*%mend;*);
的变体,可以解决问题,有时则不能。重新启动SAS是解决问题的可靠方法)
上述第2条也是如此-如果一个神奇的字符串不能修复它,那么您可能只需要重新启动SAS会话。当然,您仍然需要找到不匹配的引号/括号/等,但您首先需要重新启动SAS,以便您能够找到它。因此,如果宏变量是指定的,那么您需要将其引用为
”&报告日期“dt
让SAS将其解释为日期时间文字,而不是随机的字母和数字流。此外,SAS中的数据集引用不能有三个级别。您可以参考WORK.A042015
或仅A042015
。此外,我还将颠倒年份和月份的顺序,以便在按词汇排序时,数据集名称将按时间顺序显示。SAS在为SAS数据集生成的物理文件中使用的文件扩展名也是“sas7bdat”。