我正在使用SYSPBUFF将各种数量的参数传递给宏。具体来说,我正在通过一份州名单。使用的其中一个州是俄勒冈州或“或”,并且一个州导致我错误。
我收到错误“ERROR:在%EVAL函数或%IF条件中找到了一个字符操作数,其中需要一个数字操作数。条件是:& ST ^ = 错误:%DO%WHILE循环中的条件& ST ^ =,产生无效或缺失值,。宏将停止执行。
我已经使用了所有各种引用掩码来尝试解决此问题,但没有一个能够正常工作。
& STATES包括以下状态: AK,AZ,CA,HI,ID,NV,OR,WA
这是我目前的代码:
RSUBMIT;
PROC SQL;
connect to oracle
(path=DW user=&USER pw=&PW);
%macro DTCNT() / parmbuff;
%let i=1;
%let ST=%scan(&SYSPBUFF,&I);
%do %while (&ST^=);
CREATE TABLE MD_&ST._IP_ADJDT_CNTS_S1 AS
select *
from connection to oracle
(SELECT adjudication_date,
count (*) as LINE_CNT
from MD_r&NUM..&ST._IP_hdr_f
group by adjudication_date
order by adjudication_date);
%let i=%eval(&I+1);
%let ST=%scan(&SYSPBUFF,&I);
%end;
%mend DTCNT;
%DTCNT(&STATES);
disconnect from oracle;
QUIT;
ENDRSUBMIT;
非常感谢任何协助。
提前致谢。
答案 0 :(得分:2)
这里的问题是俄勒冈州。它的缩写是OR,它也是一个保留字(oops!)。请记住,宏语言只是正常解析的文本 - 因此当它找到& ST并转换为OR时,它会将其视为
%do %while (or ^= )
导致它混淆,因为它没有看到任何可以使用的东西。
你可以在这里使用宏引用来使SAS不像布尔运算符那样对待它。 %SUPERQ
对我来说是最后一个,但其中一些应该有用。
这是一个例子。我添加了一些额外的东西来扫描处理parens。
%let states=AK,AZ,CA,HI,ID,NV,OR,WA;
%macro DTCNT() / parmbuff;
%let i=1;
%put &=syspbuff.;
%let ST=%scan(&SYSPBUFF,&I,%str(%(%),));
%put &=st.;
%do %while (%superq(ST)^=);
%put &=st;
%let i=%eval(&i.+1);
%let ST=%scan(&SYSPBUFF,&I,%str(%(%),));
%end;
%mend DTCNT;
%DTCNT(&STATES);
答案 1 :(得分:1)
关于如何测试空宏变量Chang Chung's Is This Macro Parameter Blank,有一篇很好的论文。
对于您的简单程序,我发现使用%length()
测试空宏变量要容易得多。
%do %while (%length(&ST));