【发布时间】:2017-05-17 15:50:50
【问题描述】:
这里是新人,所以如果我做错了什么,我深表歉意。我也是SAS的新用户。
我创建了一个宏,它首先调用一个 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,要么不使用。 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 代码,还是只是填充宏变量? -
我编辑了代码以使其更清晰。感谢您的回复。