Используйте команду 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;
Другие вопросы по тегам