SAS:如何循环工作文件以附加多个数据库表

SAS: How to loop though work file to append multiple database tables

我有一大堆数据库 table 需要添加到 SAS 上的合并 table 中。

此 table 列表从 csv 文件导入 SAS,类似于以下数据:

index table_name column_1_name
1 table_one_a column1
2 table_one_b columnOne
3 table_one_c column_1
4 table_one_d column_1_1
etc ........ etc..... etc.....

我想附加此列表中的每个 table,然后通过引用上面列表中的 column_1_name 列更改适用的名称。

以下代码改编自 this link,说明了我希望 SAS 如何将上述列表中的 table 附加在一起。但是我不知道如何将上面的 table 列表及其列名转换为变量,以便它们可以在下图所示的宏中循环。

有没有一种方法可以将这个 table 列表转换成一个变量,然后我可以通过它的索引号循环它?

非常感谢任何帮助。

 libname dbname ODBC DSN=databaseName;

 %let table = table_one_a; run;

 %let column_one = column1; run;

 %MACRO append_tables;

     %If index =1 %Then %Do;

     data first_table;
     set dbname.&table.;
     &column1. = column1; 
     keep column1 column2  etc;
     run;

     %End;

     %Else %Do;

     data later_table;
     set dbname.&table.;
     &column1. = column1; 
     keep column1 column2  etc;
     run;

     proc append 
     BASE = first_table
     DATA = later_table;
     run;

     %End;

 %MEND;

为什么不使用循环而不是从列表中提取所有表名?另外,为什么不使用单个 SET 语句而不是 APPEND 过程?

*-- Create table list sample --*;

data csv_list;
length column_name .;
table_name = "table_one_a"; column_name = "Col1"; output;
table_name = "table_one_b"; column_name = "Column1"; output;
table_name = "table_one_c"; column_name = "Colonne1";output;
run;

*-- Create synthetic data for each table in table list --*

data temp.table_one_a;  
Col1 = 1;
run;

data temp.table_one_b;
Column1 = 2;
run;

data temp.table_one_c;
Colonne1 = 3;
run;
libname temp "/home/kermit/Whosebug";

*-- Create macro tables with all table names + renaming --*

proc sql;
  select cats(strip("temp."||table_name),"(rename=(",column_name,"=column1))") into :tables separated by " "
    from csv_list;
quit;

*-- Append using set statement --*

data want;
  set &tables.;
run;
*-- Tables macro is a concatenation of all table names in table list, separated by a space --*

%put &=tables;
TABLES=temp.table_one_a(rename=(Col1=column1)) temp.table_one_b(rename=(Column1=column1)) 
 temp.table_one_c(rename=(Colonne1=column1))


*-- Result is the vertical combination of all tables + renaming in the tables macro --*

data _null_;
set want;
put id;
run;

column1
   1   <-- table_one_a
   2   <-- table_one_b
   3   <-- table_one_c