這裏是新的,所以如果我做錯了,我很抱歉。我也是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