Macros 宏调用数据集并连接它

Macros 宏调用数据集并连接它,macros,sas,concatenation,Macros,Sas,Concatenation,我知道如何从文件夹中调用不同的表。这是通过函数:%let x1=libname.foldername完成的。我的问题是如何用一个简单的宏在1000个表上执行它 SAS 我会避免将数据从数据集移动到宏变量中 首先要尝试的是不要使用宏编码。尝试只使用数据集列表。如果可以找到所需数据集的一个或多个常用前缀 data project.TABLE_FINALE; set project.TABLE_20: ; run; 如果确实想将列表放入宏变量中,那么概念上更清晰,如果只将列表放入单个宏变量中,

我知道如何从文件夹中调用不同的表。这是通过
函数:%let x1=libname.foldername
完成的。我的问题是如何用一个简单的宏在1000个表上执行它

SAS


我会避免将数据从数据集移动到宏变量中

首先要尝试的是不要使用宏编码。尝试只使用数据集列表。如果可以找到所需数据集的一个或多个常用前缀

data project.TABLE_FINALE; 
  set project.TABLE_20: ;
run;
如果确实想将列表放入宏变量中,那么概念上更清晰,如果只将列表放入单个宏变量中,编码也更容易

proc sql noprint;
  select dsname into :dslist separated by ' '
  from mylist;
quit;

data project.TABLE_FINALE; 
  set &dslist;
run;
但如果您真的有1000个数据集,那么这可能太多,无法放入单个宏变量中(限制为65K个字符)

您也可以从数据生成代码,而不是使用宏生成代码。这样就不需要将任何数据移动到宏变量中。例如,您可以使用
callexecute()

proc sql noprint;
  select dsname into :dslist separated by ' '
  from mylist;
quit;

data project.TABLE_FINALE; 
  set &dslist;
run;
data _null_;
  set mylist end=eof;
  if _n_=1 then call execute('data project.TABLE_FINALE; set');
  call execute(' '||trim(dsname));
  if eof then call execute(';run;');
run;