我有一个包含多个“XO代码”的ID列表。我想创建一个宏,它将遍历这些ID,并使用与适当的XO代码对应的where语句为每个ID创建一个表。 EX:
%let ID_77= '35X02','35X04';
%let DnO_IDs= &ID_77; /intends to add more &ID_ numbers/
%macro loop;
proc sql;
%do k=1 %to %sysfunc(countw(&DnO_IDs_Ids.));
%let ID= %scan(&DnO_IDs.,&k.);
create table EP_&ID as
select * from table
where XO in ("&ID.") and AY>=(&CurrY-14);
%end;
quit;
%mend;
%loop;
我收到此错误: 错误:在%EVAL函数或%IF条件中找到了一个字符操作数,其中需要一个数字操作数。条件是: '35X04' 错误:参数2到宏功能%SCAN不是数字。 错误:宏LOOP将停止执行。
答案 0 :(得分:1)
报价是一个问题,不应该被要求。使用逗号作为分隔符也会造成麻烦。使用空格会更好。
%let ID_77= 35X02 35X04;
%let DnO_IDs= &ID_77; /intends to add more &ID_ numbers/
%let CurrY=2015;
%macro loop;
%local k id ;
proc sql;
%do k=1 %to %sysfunc(countw(&DnO_IDs));
%let ID= %scan(&DnO_IDs,&k);
create table EP_&ID as
select * from table
where XO in ("&ID") and AY>=(&CurrY-14)
;
%end;
quit;
%mend;
%loop;
如果您确实希望将这些值用作带引号的逗号分隔列表,那么您需要相应地修改COUNTW()
和%SCAN()
函数调用,并添加对DEQUOTE()
的调用以删除引号
%let ID_77= '35X02','35X04';
... %sysfunc(countw(%superq(DnO_IDs),%str(,)));
%let ID= %sysfunc(dequote(%scan(%superq(DnO_IDs),&k,%str(,))));
答案 1 :(得分:0)
我认为这应解决问题: %do k = 1%to%eval(%sysfunc(countw(& DnO_IDs_Ids。)));
可能是%sysfunc返回值被视为非整数。