自動SQL変数? userで、SAS実行ユーザーの情報をマクロ変数を使わずにゲットする話

自動マクロ変数ってあります。

ユーザーが値を入れなくても、勝手に決まった名前で作成されているマクロ変数です。

%put _automatic_;

って書いて実行すればログに溢れてきます。
なにせ自動で作成されているので、利用すると労力削減になるケースが多くて万歳です。


例えば、データセットを作成するプログラムがあったとして、
そのデータセットを誰が作ったかをデータセットに変数の値として持たせたいとします。

data A;
 X=2;
run;

自動マクロ変数&SYSUSERIDを使えば、SASセッションを開始した
ユーザー(PCに設定されているユーザー名)が簡単に取得できます。

data B;
set A;
 X=X*2;
 NAME="&SYSUSERID";
run;





これで、いちいちログ見なくても
SASYAMAがデータセットBを作成したってことが一目瞭然です。
(データセットに作成者全レコードに持たせるなんてマジ無駄ですが)

で、これを同じ様にSQLで書くと

proc sql;

create table C as
select X*2 as X
       ,user as NAME
from A;

quit;

とかけます。

この「user」っていうのが、別にマクロ変数でもないのに、固有の変数名で
&SYSUSERIDと同じ値を返します。


でも当然


proc sql;

create table D as
select X*2 as X
       ,"&SYSUSERID"as NAME
from A;

quit;

も通るので、あんまりお勧めできる書き方ではないかも
(ぱっと見、知っている人じゃないと意味が取れないし)

意地でもマクロ変数をコードから排除してやるって方はどうぞ。


ちなみに僕は必然性がない限り極力マクロは使わない派です。
マクロを使うべきところに使っているのは当然いいですし、マクロなしで
SASプログラミングは成立しないと思っています。

しかし、他人様のSASコードを見ていると、SQLで簡単に処理できたり
class や by ステートメントやtransposeプロシジャをうまく使えば

簡単なコードと最小ステップでまわせるような処理を
わざわざ細切れのマクロにして、グルグル回していたりして、
それはSASの良さを殺してんじゃないかしら、、と思ったりして。


かなり偉そうになりましたのでこの辺まで。

多分、複雑なマクロ組めないのでひがんでいるんですね










0 件のコメント:

コメントを投稿