无法访问在DATA步骤中定义的变量的值

时间:2018-12-04 19:48:46

标签: sas

我正在尝试定义一个全局“当前年份”变量,我可以用它来索引数据库中的不同表。例如,我有下表:

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))失败了...

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函数以执行浮点算术。