Sas 从数据步骤中调用宏

Sas 从数据步骤中调用宏,sas,row,Sas,Row,在维护其他人的SAS项目时,我发现了一些代码片段,它在数据步骤中创建了一个表input stats。变量&all.包含要检查的表列表。数据步骤相当长,我在这里用/*more code*/将其缩短: %let all = "work.table1*mywork.table2"; data input-stats; i = 1; do while (scan(&all., i, '*') ne ''); na

在维护其他人的SAS项目时,我发现了一些代码片段,它在数据步骤中创建了一个表
input stats
。变量
&all.
包含要检查的表列表。数据步骤相当长,我在这里用
/*more code*/
将其缩短:

%let all = "work.table1*mywork.table2";
   
   data input-stats;
      i = 1;      
      do while (scan(&all., i, '*') ne ''); 
      name = scan(&all., i, '*');  
      /* more code */
      output;
      i = i + 1;
    end;
   run;
我想用另一列来扩展表
input stat
,该列给出了每个表的行数。我在项目中发现以下宏正是这样做的:

   %macro count_rows(ds);
      %let DSID=%sysfunc(OPEN(&DS.,IN));
      %let NOBS=%sysfunc(ATTRN(&DSID.,NOBS));
      %let RC=%sysfunc(CLOSE(&DSID.));
      &nobs
   %mend;
现在,我想在上述数据步骤中集成此调用,但显然,我不能像在其他编程语言中那样简单地添加
行=%count\u行(名称)
(例如,而不是
/*更多代码*/


如何以最少的代码修改来解决这个问题?有没有一种方法可以在循环时不产生巨大的
%?

通过调用相同的函数,可以在数据步骤范围内复制宏代码的功能。使用
RESOLVE
callexecute
时,不需要宏和混合作用域,这可能会造成混淆

...
      name = scan(&all., i, '*');  
      /* more code */

* add row counting code here;
_dsid = open (name,'IN');
nobs = attrn(_dsid,'NOBS');
_dsid = close (_dsid);
drop _:;

      output;
...

简单干净的解决方案,我没有想到。。。