ここに新しくなったので、何か間違ったことをお詫びします。私は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を使用するかどうかを決めます。 OR_INとOR_OUTはlibnames(oracleエンジン)です。
マクロMc_Copy_Tableが実行されたとき、TABLE1を引数として、まず存在しないTABLE1を開こうとするMc_Obsnvarsが最初に実行されます。 proc SQLはその後に実行されます。
proc sql
より前にマクロが実行されるのはなぜですか? proc sql
を最初に実行させる方法はありますか? proc sql
の部分をマクロに入れても問題は解決しません。ありがとう:)
は、あなたが最初と時間PROC SQLを実行する観測数を計算します。それが正しい場合、2つのマクロは必要ありません。 %Mc_Obsnvars(&TABLE_NAME)を削除してコードを実行してください。 –
マクロ呼び出しの前に 'create table'文を終了するセミコロンはありますか?そうでなければ、 'create table'が実行される前に%Mc_Obsnvars()が実行されます。 PROC SQLのステップはどこで終了しますか?また、%Mc_Obsnavars()はSASコードを生成していますか、それともマクロ変数に値を設定していますか? – Quentin
コードを編集して明確にしました。ご回答いただきありがとうございます。 – Spoutnik