这里是新的,所以如果我做错了,我很抱歉。我也是SAS的新用户。SAS - 一个宏,在宏中调用一个proc sql
我创建了一个宏,它首先调用一个proc sql,创建一个我想将它传递给另一个宏(在第一个宏内部)的特定表。
%Macro Mc_Copy_Table (TABLE_NAME);
proc sql;
create table &TABLE_NAME as
select *
from OR_IN.&TABLE_NAME;
connect using OR_OUT;
execute (truncate table &TABLE_NAME) By OR_OUT;
disconnect from OR_OUT;
quit;
%MC_obsnvars(&TABLE_NAME);
%put &Nobs;
%if &Nobs > 100000 %then
%do; /* use of the sql loader */
proc append base = OR_OU. &TABLE_NAME (&BULKLOAD_OPTION)
data = &TABLE_NAME;
run;
%end;
%else
%do;
proc append base = OR_OU. &TABLE_NAME (Insertbuff=10000)
data = &TABLE_NAME;
run;
%end;
%Mend Mc_Copy_Table;
的Mc_Obsnvars宏使用attrn
函数来获取从给定数据集的观测数(它首先打开数据集)。根据观察次数,我的程序要么使用sqlloader,要么不使用sqlloader。 OR_IN和OR_OUT是libnames(oracle引擎)。
当执行宏Mc_Copy_Table时,我们假设TABLE1为参数,首先执行Mc_Obsnvars,尝试打开尚不存在的TABLE1。之后执行proc sql。
为什么宏在proc sql
之前执行?有什么办法可以先执行proc sql
?将proc sql
部分放入宏中并不能解决问题。谢谢:)
如果我明白你的问题,你要第一时间执行PROC SQL就计算观测数。如果这是正确的,则不需要两个宏。请删除%Mc_Obsnvars(&TABLE_NAME)并运行您的代码。 –
在宏调用之前是否有分号结束'create table'语句?如果不是,那么%Mc_Obsnvars()将在执行'create table'之前执行。你的PROC SQL步骤在哪里结束?另外,是%Mc_Obsnavars()生成任何SAS代码,还是它只是填充一个宏变量? – Quentin
我编辑了代码,使其更清晰。谢谢你的回复。 – Spoutnik