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

用于创建多个proq sql表的SAS宏。错误:需要数字opperand,sas,sas-macro,Sas,Sas Macro,我有一个包含多个“XO代码”的ID列表。我想创建一个宏,该宏将循环遍历这些ID,并使用对应于相应XO代码的where语句为每个ID创建一个表。例: %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.));

我有一个包含多个“XO代码”的ID列表。我想创建一个宏,该宏将循环遍历这些ID,并使用对应于相应XO代码的where语句为每个ID创建一个表。例:

%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’ 错误:宏函数%SCAN的参数2不是数字。
错误:宏循环将停止执行。

我认为这应该可以解决问题: %do k=1%到%eval(%sysfunc(countw(&DnO_id_id.))


可能是%sysfunc返回值被视为非整数

引用是一个问题,不需要。使用逗号作为分隔符也会引起麻烦。使用空格会更好

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

您的值列表中有引号。因此,当您扫描列表时,您将把引号放入宏变量中。因此,您正试图创建一个名为
EP_u35x02'
的表。您应该从原始列表中删除引号,或者从新的
ID
宏变量中删除引号。
&DnO\u ID\u ID.
在做什么?与
%let
语句相比,这是一个额外的
&ids
。SAS宏语言在宏变量方面没有“整数”的概念。这正是
%scan
函数在内部所做的,并且正在失败。是的。。我的错。自动将%EVAL添加到%SCAN和%QSCAN中。无论如何,再次添加它是多余的。我编辑了相应的代码,现在收到了这个错误:错误:无效的符号变量名“35X02”,“35X04”。这些代码以前在proc sql表中使用逗号分隔和引号格式引用过,因此我不理解为什么变量名现在会无效。如果不查看日志,很难判断。您不会使用
'35X02'、'35X04'
作为任何东西的名称。在('35X02','35X04')中,它可能是类似于
XO这样的语句的一部分。也许这些值仍然是宏引用的?如果应用了宏引号,可以尝试使用
%unquote()
宏函数从值中删除宏引号,以便宏处理器将未引号的字符传递给SAS语言处理器。仅供参考,SAS中的最佳做法是不这样做。很少需要以这种方式分割数据,因为分组处理相当有效。另外,这里有一篇关于完成这项任务的几种常见方法的综述。