SASマクロ、あまり得意じゃないのですが、ユーザー定義のマクロ変数の削除についてです。
data A;
X=1;output;
X=2;output;
run;
proc sql noprint;
select count(*) into:obs1
from A;
quit;
今、値2の入ったマクロ変数obs1が作成されました。
%SYMDEL obs1;
消えました。
めでたしめでたしで終わりなのですが、
例えば、いっぱいマクロ変数を作成していて、それを一括で消したい場合
いちいち%SYMDELで指定するの面倒ですね、というかデータ内容に応じて可変的に
作成している場合、どれだけ作られるかわかりませんしね。
で、SAS社の古いヘルプだと
data symdel;
set sashelp.vmacro;
where scope = 'GLOBAL' ;
run;
data _null_;
set symdel;
call symdel(name);
run;
としているのです。
sashelp.には現在のSASセッションで最新の情報がテーブルビューとして格納されていて
SQLやデータステップで利用することで、存在する変数・ライブラリ・データセットなどなどの情報を
取得できるのですが
今回はvmacroというテーブルから、存在するマクロ変数の情報を取得します。
scopeという変数に、GLOBALまたはAUTOMATICといった値が入るのですが
GLOBALで絞ることで、自動マクロ変数以外を全部けしてやろうということですね
call symdelルーチンでマクロ変数を消せます。
ただ、いつのバージョンからか調べてないのですが
SQLを使うと
SYS_SQL_IP_ALL SYS_SQL_IP_STMTというマクロ変数が作成され、
カテゴリとしてはGLOBALなのに消そうとすると消せないのでエラーになってしまいます。
ので、
data symdel;
set sashelp.vmacro;
where scope = 'GLOBAL' and NAME not in ('SYS_SQL_IP_ALL','SYS_SQL_IP_STMT');
run;
data _null_;
set symdel;
call symdel(name);
run;
としてやればOKです。
0 件のコメント:
コメントを投稿