SAS 宏变量将无法解析

SAS macro variable will not resolve

再试一次。此代码将不起作用。这是一个愚蠢的代码,但仍然不起作用。

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  

您使用 %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)