2017-02-14 238 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