Error handling 在SAS中的DO循环中使用宏变量时出错:在表达式中找不到必需的运算符

Error handling 在SAS中的DO循环中使用宏变量时出错:在表达式中找不到必需的运算符,error-handling,sas,sas-macro,Error Handling,Sas,Sas Macro,我正在使用SAS,我需要组合许多表,每个表的名称中都有月和年的后缀。要使用的特定表格将根据用户定义的开始和结束日期而变化。为了实现这一点,我尝试通过宏使用do循环来循环日期范围内的月/年,并附加到上一个表中。但是,我遇到了一些问题(似乎与在循环中使用开始/结束年份的宏变量有关)。我收到以下错误: ERROR: Required operator not found in expression: &start_year. ERROR: The %FROM value of the %DO

我正在使用SAS,我需要组合许多表,每个表的名称中都有月和年的后缀。要使用的特定表格将根据用户定义的开始和结束日期而变化。为了实现这一点,我尝试通过宏使用do循环来循环日期范围内的月/年,并附加到上一个表中。但是,我遇到了一些问题(似乎与在循环中使用开始/结束年份的宏变量有关)。我收到以下错误:

ERROR: Required operator not found in expression: &start_year. 
ERROR: The %FROM value of the %DO QUOTE_YEAR loop is invalid.
ERROR: Required operator not found in expression: &end_year. 
ERROR: The %TO value of the %DO QUOTE_YEAR loop is invalid.
ERROR: The macro GET_PRICES will stop executing.
下面是我提出的一些示例测试代码,它复制了产生错误的问题,我正试图调试这些错误。请注意,对于这个例子,我只循环了几年。(解决此问题后,我将添加月份。)

预期输出是一个单列“t”的表,有3行:(0、2018、2019)。(我刚才包含的0值用于初始化要附加的非空表。)当我将循环值中的开始/结束年份的宏变量替换为实际值时,代码会起作用

不起作用

%DO quote_year = &start_year. %TO &end_year.;
有效

%DO quote_year = 2018 %TO 2019;
我搞不清楚是什么导致了这次失败。我相信这一定与我定义宏变量的方式有关,但奇怪的是,如果我完全删除do循环,并在%LET语句下执行以下数据步骤,那么这些值将按预期显示

DATA test_macro_values;
    s = &start_year.;
    t = &end_year.;
    u = &start_month.;
    v = &end_month.;
RUN;

有人能看到出了什么问题吗?

没有名为
的宏函数。您应该使用
%sysfunc

%LET start_year = %sysfunc(year(&start_date.));
%LET end_year = %sysfunc(year(&end_date.));
%LET start_month = %sysfunc(month(&start_date.));
%LET end_month = %sysfunc(month(&end_date.));

有趣的。。。这对我有用。但是,我必须问一个问题,如果在那些%LET语句中无法在宏中使用普通SAS函数,那么如何使用这些宏变量的值创建一个简单的数据集,因为它们最初在我的代码中定义?@Wolff它可能起作用,因为您使用宏变量生成SAS代码,其中年份()函数将被识别。@Wolff当您像以前一样初始化宏变量时,此宏变量的值等于“year(&start_date.)”,因此,如果您想在数据步骤中初始化某个变量以得到计算结果并写入“variable=&start_year”,则将在数据步骤中执行计算。若要在%let语句中初始化宏变量计算结果时将其存储在宏变量中,则应使用%sysfunc。
%LET start_year = %sysfunc(year(&start_date.));
%LET end_year = %sysfunc(year(&end_date.));
%LET start_month = %sysfunc(month(&start_date.));
%LET end_month = %sysfunc(month(&end_date.));