如何使用在宏中使用 SYSPBUFF 传递的变量列表来屏蔽 "OR"

How to mask "OR" with variable list passed through using SYSPBUFF in macro

我正在使用 SYSPBUFF 将各种数量的参数传递到宏中。具体来说,我正在浏览一个状态列表。正在使用的州之一是俄勒冈州或 "OR" 并且那个州导致我出错。

我收到错误“错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。条件为:&ST^= 错误:%DO %WHILE 循环中的条件 &ST^= 产生无效或缺失值,。宏将停止执行。

我已经使用了所有各种引用掩码来尝试解决此问题,但 none 有效。

&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;

如有任何帮助,我们将不胜感激。

提前致谢。

这里的问题是俄勒冈州。它的缩写是OR,也是一个保留字(哎呀!)。请记住,宏语言只是文本,然后会像正常情况一样进行解析 - 所以当它找到 &ST 并转换为 OR 时,它会将其视为

%do %while (or ^= )

这导致它感到困惑,因为它看不到任何与 or 一起使用的东西。

您可以在此处使用宏引号使 SAS 不将其视为布尔运算符。 %SUPERQ 是我的首选,但其中一些应该有效。

举个例子。我还添加了一些额外的东西来扫描以处理括号。

%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);

有一篇关于如何测试空宏变量的好论文,Chang Chung's Is This Macro Parameter Blank

对于您的简单程序,我发现使用 %length() 来测试空宏变量要容易得多。

%do %while (%length(&ST));