Sas 无法访问数据步骤中定义的变量值

Sas 无法访问数据步骤中定义的变量值,sas,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; ru

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

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;
PROC SQL;
    SELECT * FROM schema.tb_&v_curr_year.;
QUIT;
正如预期的那样,2018年和2017年的印刷品。但是,当我尝试这一点时:

data _null_;
    v_curr_year = PUT(TODAY(), YEAR4.);
    v_last_year = v_curr_year - 1;
    PUT v_curr_year;
    PUT v_last_year;
run;
PROC SQL;
    SELECT * FROM schema.tb_&v_curr_year.;
QUIT;
我明白了

如何定义这个
v\u curr\u year
变量,以便动态引用这样的年份


我尝试使用
%LET v_last_year=year(INTNX(“year”,sysdate,-1))
失败…

如果试图在数据步骤中分配宏变量,则需要使用
调用symput()
调用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
执行浮点运算。

您需要在宏语言中的大多数函数周围使用
%sysfunc()