2014年9月8日月曜日

自動マクロ変数「&SQLOBS」で、SQLが処理した行数を取得する



自動マクロ変数「&SQLOBS」には「SQLプロシジャが処理した行数」が格納される。
以下のようなイメージです。
  • select, from, where, group by, havingによって生成した結果の行数
  • updateによって更新した行数
  • deleteによって削除した行数
  • insertによって追加した行数
  • noprint, view, intoなどを使用している場合は挙動に変化あり。

具体例を見ていきましょう。


* サンプルデータ作成(obs数=10)  ;
data DT1;
   do A=1 to 10;
        output;
   end;
run;

*** 例① **************;
proc sql;
  select A
  from DT1;
quit;

%put --- &SQLOBS ---;
select, from句によって選択された10行が結果ビューアに出力される。
よって、SQLOBSには「10」が入る。
%putステートメントでログにSQLOBSの値を展開してるので、確認してみましょう。


*** ② **************;
proc sql;
  create table DT2 as
  select A
  from DT1;
quit;

%put --- &SQLOBS ---;
select, from句によって選択された10行がデータセットDT2に出力される。
よって、SQLOBSには「10」が入る。


*** ③ **************;
proc sql noprint;
  select A
  from DT1;
quit;

%put --- &SQLOBS ---;
注意が必要。
noprint結果ビューアへの出力を抑制。またcreate tableを指定していないので、データセットへも出力せず。
この場合、内部的には1行だけしか処理していないようで、SQLOBSには「1」が入る。
ちなみに、fromやwhere等によって選択される行が存在しない場合、SQLOBSに「0」が入る。


*** ④ **************;
proc sql noprint;
  select A into :A1-:A3
  from DT1;
quit;

%put --- &SQLOBS ---;
noprintが指定されてるけど、into句がある。
ここで指定してるinto句は、「変数Aを3行分、マクロ変数A1~A3に格納する」という指定。
ということでSQLOBSには「3」が入る。


*** ⑤ **************;
data DT3; set DT1; run;

proc sql noprint;
  delete from DT3
  where A>=8;
quit;

%put --- &SQLOBS ---;
noprintが指定されてるけど、delete句がある。
ここでは「A>=8」の3行を削除しています。
ということでSQLOBSには「3」が入る。


*** ⑥ **************;
data DT4; set DT1; run;

proc sql noprint;
  update DT4 set A=10 where A>=8;
quit;

%put --- &SQLOBS ---;
noprintが指定されてるけど、update句がある。
ここでは「A>=8」の3行を更新しています。
ということでSQLOBSには「3」が入る。


*** ⑦ **************;
proc sql ;
  create view DT5 as
  select A
  from DT1;
quit;

%put --- &SQLOBS ---;
注意が必要。
viewは特殊なデータなので、処理行数は取得できない。
ということでSQLOBSには「0」が入る。



オブザベーション数を取得する方法として、よく使われるので覚えておくと便利です。


0 件のコメント:

コメントを投稿