2017-02-14 81 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分別指定U1B1的值。但價值是宏觀引用的。因此,當解析器看到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