Невозможно получить доступ к значению переменной, определенной на шаге DATA - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь определить глобальную переменную «текущий год», которую я могу использовать для индексации разных таблиц в моей базе данных.Например, у меня есть следующие таблицы:

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 голосов
/ 04 декабря 2018

Если вы пытаетесь назначить макропеременные в шаге данных, вам нужно использовать 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 для выполнения арифметики с плавающей запятой.

...