如何使用宏中的SYSPBUFF通过变量列表屏蔽“OR”

时间:2018-05-17 15:39:17

标签: sas sas-macro

我正在使用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;

非常感谢任何协助。

提前致谢。

2 个答案:

答案 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));