SAS宏变量无法解析

时间:2017-02-14 20:47:30

标签: sas sas-macro

再试一次。此代码无效。这是一个愚蠢的代码,但仍然无法正常工作。

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  

1 个答案:

答案 0 :(得分: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)