2017-05-17 45 views
0

ここに新しくなったので、何か間違ったことをお詫びします。私は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の部分をマクロに入れても問題は解決しません。ありがとう:)

+0

は、あなたが最初と時間PROC SQLを実行する観測数を計算します。それが正しい場合、2つのマクロは必要ありません。 %Mc_Obsnvars(&TABLE_NAME)を削除してコードを実行してください。 –

+1

マクロ呼び出しの前に 'create table'文を終了するセミコロンはありますか?そうでなければ、 'create table'が実行される前に%Mc_Obsnvars()が実行されます。 PROC SQLのステップはどこで終了しますか?また、%Mc_Obsnavars()はSASコードを生成していますか、それともマクロ変数に値を設定していますか? – Quentin

+0

コードを編集して明確にしました。ご回答いただきありがとうございます。 – Spoutnik

答えて

1

クエンティンは彼のコメントで言及しているように、あなたは構文の問題があると思います。これは問題ありません。

%macro copy_table(intable, outtable); 
proc sql noprint; 
create table &outtable as 
select * from &intable; 

%count_obs(&outtable); 
%put NOBS:&nobs; 
quit; 
%mend; 

%macro count_obs(table); 
%global nobs; 
select count(*) into :nobs trimmed from &table; 
%mend; 

data test; 
do i=1 to 10; 
    output; 
end; 
run; 

%copy_table(test,test2); 

ただし、カウントする必要はありません。 PROC SQLの自動変数&sqlobsがあり、最後のクエリから返されたレコード数があります。

だから、これはあなたが探しているものをお与え、私は思う:私はあなたの質問を理解している場合

%macro copy_table(intable, outtable); 
proc sql noprint; 
create table &outtable as 
select * from &intable 
where i < 5; 

%let nobs=&sqlobs; 
%put NOBS:&nobs; 
quit; 
%mend; 
%copy_table(test,test2); 
+0

'&sqlobs'トリックのおかげで、ありがとう。私は自分の質問を編集しました(コード部分を置き換えました)。マクロが 'proc sql'を実行する前に'%Mc_Obsnvars(&TABLE_NAME) 'を実行しているので)、Work.TABLE1(私が作成したテーブル)が存在しないことをログが教えてくれます。ここでは、 'proc sql'の外にマクロ呼び出しがあるので、quitステートメントの後にあります。 Btw、 'proc sql'の内部または外部でマクロ呼び出しを行うことに違いはありますか? – Spoutnik

+0

私は '%let Nobs =&sqlobs;'を 'proc sql'の外で使ってみましたが、常に'%MC_obsnvars(&TABLE_NAME); 'を使用したときと同じです。非常に奇妙な。私は、コードを再提出すると、sqlloaderを使用する 'proc append'が実行されていることに気付きました(今は作業テーブルが存在するので、解決策ではありません)。 – Spoutnik

+0

これでまだ苦労しているのなら、 'options notes mprint mlogic symbolgen;'を設定し、コードを実行して関連するログ部分を質問に貼り付けてください。 – DomPazz

関連する問題