(最後に注意点の記事リンクも貼ったので、そちらも要参照)
* サンプルデータ ;
data DT1;
input A$ B$ @@;
cards;
001 AA 002 BB 003 CC
run;
A
|
B
|
---|---|
001
|
AA
|
002
|
BB
|
003
|
CC
|
上記変数A,Bの値をマクロ変数に格納します。
* 変数値をマクロ変数に格納 ;
proc sql noprint; select A, B into :A1-, :B1- from DT1; quit; %let OBS = &SQLOBS; * ログにマクロ変数値を展開 ; %macro MAC; %do i=1 %to &OBS; %put &&A&i &&B&i; %end; %mend; %MAC;
ログ
001 AA
002 BB
003 CC
|
SQLのINTOを使った方法(「こちら」を参照)
ただし「into :A1-, :B1-」という書き方はSAS9.3より前のバージョンでは使えないので
データステップ100万回「SQLでマクロ変数に値を格納する into: separated by」で紹介されている「into :A1-:A9999, :B1-:B9999」と値を大きくとっておくテクニックが使えます。
そしてもうひとつ重要な役割をするのが自動マクロ変数SQLOBS。
直前のSQLプロシジャが処理した行数が自動で入ってきます。(詳細は「こちら」を参照)
これを%DOループで利用してます。
一般的に使われるのはCALL SYMPUTXですが、SQLのINTOと&SQLOBSのコンボ技の方がスッキリとした文になるので個人的に好きな方法ではあります。
・数値をマクロ変数に格納すると丸められる可能性がある
・フォーマットが割り当てられた変数だと、フォーマットを当てた値がマクロ変数に格納される。
0 件のコメント:
コメントを投稿