2017-02-14 9 views
-1

Попробуйте еще раз. Этот код не будет работать. Это глупый код, но он все еще не работает.Переменная макроса SAS не будет разрешена

data work.colnames; 
     input cols $; 
     cards; 
     U1 
     B1 
     ; 
run; 


data work.test; 
     input rp_U1 $ rp_B1 $; 
     cards; 
     col1 col2 
     ; 
run; 

%macro maketest; 
     proc sql; 
      select cols 
        into :col separated by " " 
      from colnames;   
     quit; 
     %do i=1 %to 2;       
      %let c = %qscan(&col,&i);       
      %put rp_&c; 
      proc sql; 
        create table test&i as 
        select     
        rp_&c     
       from work.test;    
      quit;  
    %end; 
%mend; 
%maketest; 

Я получаю эту ошибку:

ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, *, **, +, ',', -, '.', /, <, <=, <>, =, >, >=, ?, AND, AS, 
      CONTAINS, EQ, EQT, GE, GET, GT, GTT, LE, LET, LIKE, LT, LTT, NE, NET, OR, ^=, |, ||, ~=. 

Что я нахожу странным, если я пытаюсь получить столбцы без rp_ этот код работает поиск. Кроме того, измените

select     
rp_&c 

к

select     
&c 
+0

поворот на MPRINT (опций 'MPRINT;') и прикрепить журнал к вопросу. Нам будет намного легче помочь вам отладить эту проблему. – DomPazz

ответ

2

макросоци- процитировать вы представили, используя %QSCAN() функцию вместо функции %SCAN(), вероятно, вызывает проблемы для синтаксического анализа SAS.

В вашем коде макрокоманде C присваиваются значения U1 и B1, соответственно. Но значения указаны макросом. Поэтому, когда парсер видит rp_&c, он думает, что это два отдельных токена, поэтому он рассматривает его как токен rp_, за которым следует токен U1 вместо одного токена rp_U1.

Вам не нужно цитировать строку, которая будет частью имени переменной, так что вы должны изменить

%let c = %qscan(&col,&i); 

в

%let c = %scan(&col,&i); 

Но если вам нужно иметь макрос со ссылкой на то вы можете использовать функцию %unquote(), чтобы удалить ее. Меняем

select rp_&c 

к

select %unquote(rp_&c) 
+0

Хорошо, поэтому в моем коде c = & col – fossekall

+0

В вашем коде макросам C присваиваются значения 'U1' и' B1'. – Tom

+0

Хорошо. Мне нужно больше узнать о макрокоманде. Я вижу, что я не понимаю – fossekall