再试一次。此代码无效。这是一个愚蠢的代码,但仍然无法正常工作。
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 :(得分:2)
使用%QSCAN()
函数而不是%SCAN()
函数引入的宏引用可能会给SAS解析器带来麻烦。
在您的代码中,宏变量C分别被赋值为U1
和B1
。但这些值是宏报价。因此,当解析器看到rp_&c
时,它认为这些是两个单独的令牌,因此它将其视为令牌rp_
,后跟令牌U1
,而不是rp_U1
的单个令牌。
您不需要引用将成为变量名称一部分的字符串,因此您应该更改
%let c = %qscan(&col,&i);
到
%let c = %scan(&col,&i);
但是如果您确实需要宏引用,那么您可以使用%unquote()
函数将其删除。所以改变
select rp_&c
到
select %unquote(rp_&c)