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 分别被赋值为 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)
再试一次。此代码将不起作用。这是一个愚蠢的代码,但仍然不起作用。
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 分别被赋值为 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)