Как замаскировать «ИЛИ» в под-макросе с помощью списка переменных, переданного с использованием SYSPBUFF в макросе - PullRequest
0 голосов
/ 28 марта 2019

Я использую SYSPBUFF для передачи различных чисел параметров в макрос.В частности, я прохожу через список состояний (внутренний запрос) и регионов (внешний запрос).Одним из используемых состояний является штат Орегон, который сокращается до «ИЛИ», и это одно состояние вызывает у меня ошибку.

Ранее я задавал почти идентичный вопрос и получил ответ, который решил проблему.Однако теперь я добавляю рабочий макрос в другой макрос, и он больше не работает.Чего мне не хватает во внешнем макросе, который заставляет внутренний макрос больше не работать ???Я должен уточнить ... это работает, пока не доберется до Орегона.Так что макрос функционален.Опять же, внутренний запрос работает правильно и распознает ИЛИ как значение состояния, пока я не помещу его во внешний запрос, затем он прекращает распознавать ИЛИ как значение состояния.

Вот мой текущий код:

%macro ALLRG() / parmbuff; 
%let r=1;
%let RG=%scan(&SYSPBUFF,&R);  

%do %while (%str(&RG)^=);

%syslput NUM=&RG;   
%let NUM=&RG;               
%syslput STATES=&&STATESR#   
%let STATES=&&STATESR#      

RSUBMIT;
PROC SQL inobs=1;
connect to oracle
(path=OIGDW ******);
%macro VSNLT() / parmbuff; 
%let i=1;
%let ST=%scan(&SYSPBUFF,&I);  

%do %while (%str(&ST)^=);
CREATE TABLE PHL_&ST._PROV_05_VRSN AS
select TMS_RUN_TIMESTAMP
from connection to oracle
   (SELECT TMS_RUN_TIMESTAMP    
    from r&NUM._own.&ST._PROV_05);

       %let i=%eval(&I+1);  
       %let ST=%scan(&SYSPBUFF,&I);
       %end;
%mend VSNLT;
%VSNLT(&STATES);

 disconnect from oracle;
 QUIT;
 ENDRSUBMIT;

     %let r=%eval(&R+1);  
     %let RG=%scan(&SYSPBUFF,&R);
     %end;
 %mend ALLRG;
 %ALLRG(1,2,3,4,5,6,7,9);

Таблицы состояний находятся в региональных схемах, поэтому мне нужно получить доступ к нескольким схемам и таблицам, чтобы получить все состояния.Поэтому я хочу, чтобы внешний макрос устанавливал региональные параметры и параметры состояния для внутреннего макроса.

1 Ответ

1 голос
/ 28 марта 2019

Функция макроса %superq() - это, вероятно, то, что вы хотите использовать для обеспечения цитирования макросов. Вы также можете использовать %qscan() вместо %scan().

%let RG=%qscan(%superq(SYSPBUFF),&R);

Мне также не ясно, почему вы помещаете определение макроса в удаленный сеанс. Этот дополнительный уровень сложности может не понадобиться. Кроме того, передача определения макроса через rsubmit, особенно внутри макроса, может привести к тому, что SAS испортит синтаксический анализ кода. Если вам действительно нужен макрос, определенный там, определите его с помощью autocall или% include. Загрузите текст, используя proc proc, если вам нужно.

...