我目前有以下情况
%macro sqlloop (event_id);
...lots of code, mostly proc sql segments ...
%mend;
生成一个输出表(名为export_table2)。我需要能够为另一个表(名为 vars)中的每个值运行此代码数十次。我的试用代码测试了我想要它做的事情如下(基本上手动输入这个 68 行表的前两个值)
data ;
%let empl_nbr_var = '222';
%let fleet = '7ER';
%let position = 'A';
%let base = 'BWI';
%sqlloop(event_id = 1);
run;
data summary_pilots;
set work.export_table2;
run;
data;
%let empl_nbr_var = '111';
%let fleet = '320';
%let position = 'B';
%let base = 'CHS';
%sqlloop(event_id = 2);
run;
data summary_pilots;
set summary_pilots work.export_table2;
run;
这会产生每次执行的最终输出,并堆叠到一个名为“summary_pilots”的表中。我怎样才能在循环中做到这一点,预先使用call execute
迭代每一行vars
? vars 的列正是我需要的宏变量,我想迭代每一行来分配这些宏变量并运行我的%sqlloop
再次。谢谢您的帮助!
EDIT:
目前正在弄清楚调用执行是如何工作的,看看它在这里有什么帮助,但仍然有点卡住...下面的代码完全按照您的想法工作,将表变量中的所有变量打印到日志中。
data ;
set work.vars;
call execute( '%put='|| strip(empl_nbr_var) || ';
%put = ' || strip(fleet) ||';
%put = '|| strip(position) ||';
%put = ' || strip(base) ||';' );
run;
我正在尝试使用下面的代码,但由于宏被奇怪地分配,我收到了大量的错误。 vars 列中的类型与我希望它们在宏中的类型完全匹配,但看起来这仍然可能是这里的问题?
data ;
set work.vars;
call execute( '
%let empl_nbr_var =' || strip(empl_nbr_var) || ';
%let fleet = ' || strip(fleet) ||';
%let position = '|| strip(position) ||';
%let base = ' || strip(base) ||';
%sqlloop(event_id = 17);' );
run;
事件 ID 实际上在这里并不重要,所以我暂时将其保留为随机数。