我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

PROC DELETEの注意点

SAS9.4から追加された機能でproc deleteというプロシージャがあります。
Technical Support:データセットの削除
https://go.documentation.sas.com/?docsetId=proc&docsetTarget=n1469bsvzgd33jn0z4xecxmx2bgo.htm&docsetVersion=9.4&locale=ja

単純にデータセットを削除するだけなら、proc datasetsよりも早い(らしい by 公式ドキュメント)ですし、nolistとかいらん記述をしなくていい、というメリットもあります。

が、存在しないデータセットを指定すると、警告が出てしまう上にnowarnオプションが実装されていないために消すことができません。
f:id:japelin:20200910015014p:plain

これは正直しんどい。


ところで、proc deleteにはlibraryとdataを指定できますが、省略した場合はどうなるのでしょう。



libraryを省略した場合はdata=で指定したデータセットが2レベル(ライブラリ参照名.データセット名)の場合は、データセットのライブラリが優先され、1レベル(データセット名)の場合はlibrary=で指定したライブラリが適用されます。

proc delete lib=sasuser data=work.xxxxx xxxxx;
run;


f:id:japelin:20200910015337p:plain


では、dataを省略した場合はどうなるのでしょう。ドキュメントではlibraryを省略した場合はworkとして処理されるという事が書いてありますが、dataを省略した場合については記載がありません。

data a;
  a=1;
run;
data b;
  a=1;
run;
proc delete;
run;

実行してみると、以下のログがでました。
f:id:japelin:20200910015629p:plain

どうやらSASLAST自動マクロ変数を利用しているっぽいです。
SYSLAST自動マクロ変数


例えば以下のコードでも

data b;
  a=1;
run;
data temp.b;
  a=1;
run;
proc delete lib=work;
run;

f:id:japelin:20200910015813p:plain
となり、lib指定を無視してきちんとSASLAST自動マクロ変数のtemp.bを削除しています。

まぁ、なんとなく予想通りですね。proc print;と同じ

なお、data=にはX1-X5のようなリスト形式で指定できるものの、datasetsプロシージャにおける「lib=work kill」のようなライブラリ内の全データセットを削除するという指定はできないようですので、まだまだproc datasetsからは離れられなさそうです。