マクロ変数の削除

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 件のコメント:

コメントを投稿