我正在尝试定义一个全局“当前年份”变量,我可以用它来索引数据库中的不同表。例如,我有下表:
tb_2016
tb_2017
tb_2018
所有具有相同架构。对于每一年,我希望能够动态引用以前的年份而无需进行硬编码。
所以我试试这个:
data _null_;
v_curr_year = PUT(TODAY(), YEAR4.);
v_last_year = v_curr_year - 1;
PUT v_curr_year;
PUT v_last_year;
run;
按预期印刷2018年和2017年。但是,当我尝试这样做时:
PROC SQL;
SELECT * FROM schema.tb_&v_curr_year.;
QUIT;
我明白了
ERROR 22-322: Syntax error, expecting one of the following: ...
ERROR 200-322: The symbol is not recognized and will be ignored.
如何定义此v_curr_year
变量,以便我可以像这样动态引用年份?
我尝试使用%LET v_last_year=YEAR(INTNX("year", sysdate, -1))
失败了...
答案 0 :(得分:3)
如果要在数据步骤中分配宏变量,则需要使用call symput()
或call symputx()
。同样,在数据步骤中仅使用year
函数可能更容易。
data _null_;
v_curr_year = year(today());
v_last_year = v_curr_year - 1;
call symputx('v_curr_year',v_curr_year);
call symputx('v_last_year',v_last_year);
run;
现在,这两个变量已分配为宏变量。
如果要在数据步骤之外执行此操作,则可以执行以下操作。
%let v_curr_year = %sysfunc(year("&sysdate9"d));
%let v_last_year = %eval(&v_curr_year-1);
您需要%eval
函数以宏语言执行整数算术,并且需要%sysevalf
函数以执行浮点算术。