自動マクロ変数「&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 件のコメント:
コメントを投稿