Используйте команду sas select into: для создания глобальных макропеременных
Я хочу использовать select into: для создания глобальной переменной в макромодуле.
%macro example();
proc sql noprint;
select x into:DDD from aaa;
quit;
%mend;
Проблема в том, что я хочу создать глобальную переменную DDD, в этом примере мы можем получить только локальную переменную DDD. Благодарю. Wayne.
3 ответа
Я не думаю, что вы можете контролировать область действия в Proc SQL. Вы используете symputx вызова в шаге данных, чтобы указать область.
Однако макропеременные, созданные в открытом коде через Proc SQL, по умолчанию являются глобальными. Внутри макроса он будет локальным.
Как отмечено в комментариях, вы также можете явно объявить макропеременную как глобальную, используя
%global macro_variable_name;
Как указал @Reeza, вы можете просто указать, что вы хотите, чтобы макропеременная была глобальной в начале вашего макроса с помощью %global DDD;
заявление.
Всего одна точка фокусировки:
иногда вы можете вспомнить макрос из другого макроса. В этом случае вы можете иметь ту же макропеременную, существовавшую ранее, как local во external-macro. Ссылаясь на внутренний макрос с внутри %global
утверждение, что вы можете столкнуться с ошибкой из-за конфликта между глобальным и локальным определением одной и той же макропеременной (ERROR: Attempt to %GLOBAL a name (XXX) which exists in a local environment.
).
В этом случае вы можете:
- предварительно определить макро-переменную как глобальную также во внешнем-макросе
- предварительно определить макропеременную как локальную (или просто присвоить ей (не) значение с
%let
,sql into:
или жеcall symput
) во внешнем макросе, избегая%global
утверждение во внутреннем макросе
в зависимости от ваших требований к видимости макропеременных.
Я знаю, что это довольно старый пост. Но если кто-то все еще пытается это понять. В частности, в случае, если мы не знаем, сколько макропеременных будет создано запросом sql, мы можем использовать итеративный цикл %do для i=1 до &sqlobs. Затем используйте внутри него оператор %global, чтобы создать глобальную макропеременную, а затем присвоить ей значения локальных макросов sql. Метод показан ниже. Я также назначил локальный макрос sqlobs глобальному макросу, чтобы он также был доступен глобально, просто на всякий случай.
%macro DistinctVal(tab,col);
proc sql;
select distinct &col
into :DVal1 -
from &tab;
quit;
%global distinctobs;
%let distinctobs=&sqlobs;
/*We do this step to convert the local sqlobs value to Global distinctobs values*/
%do i=1 %to &distinctobs %by 1;
%global DistinctVal&i;
%let DistinctVal&i=&&Dval&i;
%end;
/*We do this step to convert the local Dval1-.... values to Global
DistinctVal1-... values*/
%mend DistinctVal;