SAS宏用于创建多个proq sql表。错误:需要数字opperand

时间:2015-10-22 15:33:17

标签: sas sas-macro

我有一个包含多个“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将停止执行。

2 个答案:

答案 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返回值被视为非整数。