2017-02-14 6 views
-1

Versuchen Sie es erneut. Dieser Code wird nicht funktionieren. Es ist ein dummer Code, funktioniert aber immer noch nicht.SAS-Makrovariable wird nicht aufgelöst

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; 

ich tun, um diese Fehlermeldung erhalten:

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, ^=, |, ||, ~=. 

Was ich seltsam finde ist, wenn ich versuche, die Spalten ohne rp_ Dieser Code funktioniert für Sie zu bekommen. Ändern Sie auch

select     
rp_&c 

zu

select     
&c 
+0

wiederum auf mprint ('Optionen mprint;') und das Protokoll auf die Frage anhängen. Es wird viel einfacher für uns sein, Ihnen bei der Fehlersuche zu helfen. – DomPazz

Antwort

2

Das Makro zitieren Sie mithilfe %QSCAN() Funktion eingeführt anstelle der %SCAN() Funktion wahrscheinlich verursacht Probleme für den SAS-Parser. In Ihrem Code erhält die Makrovariable C die Werte U1 bzw. B1. Aber die Werte sind Makro zitiert. Wenn der Parser rp_&c sieht, denkt er, dass es sich um zwei separate Tokens handelt, also behandelt es es wie Token rp_, gefolgt vom Token U1 anstelle eines einzelnen Tokens von rp_U1.

Sie sollten nicht brauchen einen String zu zitieren, die Teil eines Variablenname sein, so sollten Sie

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

zu

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

ändern Aber wenn Sie brauchen das Makro Quotierungs Dann können Sie die %unquote() Funktion verwenden, um es zu entfernen. So ändern

select rp_&c 

zu

select %unquote(rp_&c) 
+0

Okay so in meinem Code c = & col – fossekall

+0

In Ihrem Code wird die Makrovariable C die Werte 'U1' und' B1' zugewiesen. – Tom

+0

Okay. Ich muss mehr über Makrozitat lesen. Ich sehe, dass ich es nicht verstehe – fossekall

Verwandte Themen