2017年11月6日月曜日

SQLビューの作成と落とし穴②



SQLビューの作成と落とし穴①」 の続きです。


落とし穴①

以下の例をご覧ください。

data DT1;
   A=1; output;
   A=2; output;
run;

libname TEST "C:\Myfiles";

proc sql;
   create view TEST.PITFALL as
   select *
   from DT1;
quit;


TEST.PITFALL というSQLビューを作成しています。
続いて、このSQLビューをPROC PRINTで出力してみます。

proc print data=TEST.PITFALL;
run;

ログ
ERROR: ファイルTEST.DT1.DATAは存在しません。
ERROR:  直接的または間接的に参照されたデータセット、ビューの 1 つがオープンできなかったため、SQL ビュー TEST.PITFALL を処理できませんでした


ERRORが出ました。実はSQLビューの性質として、
FROM句のデータセットは、デフォルトでSQLビューと同じライブラリを参照しにいきます。

つまり、SQLビューがTESTライブラリにあるので、「from DT1」は「from TEST.DT1」と置き換えて実行されます。


今回の例では、FROM句に WORK.DT1 を適用したいので、以下のように明示的に指定する必要があります。

proc sql;
  create view TEST.PITFALL as
  select *
  from WORK.DT1;
quit;



落とし穴②

SQLビュー参照時にシステムオプションが2回適用されてしまうケースがあります。
例えば、システムオプション「FIRSTOBS=」や「OBS=」がそれにあたります。


まずは、システムオプションの「FIRSTOBS=」・・・ではなくデータセットオプションの「FIRSTOBS=」を使った場合の例。

proc sql;
   create view MYCLASS as
   select *
   from SASHELP.CLASS;
quit;

proc print data=MYCLASS (firstobs=10) noobs;
run;

SQLビューをPROC PRINTで出力していますが、データセットオプションで「firstobs=10」としてるので、SQLビューに対してオブザベーション=10から処理が開始されています。
これは想定通りです。


では次、システムオプションの「FIRSTOBS=」を使った場合。

proc sql;
   create view MYCLASS as
   select *
   from SASHELP.CLASS;
quit;

options firstobs=10;
proc print data=MYCLASS noobs;
run;
options firstobs=1;



「options firstobs=10;」で以降の処理の開始をオブザベーション=10からにしています。

  • まずはPROC PRINTでSQLビューを参照した際にクエリ(SELECT文)が動くので、その時にオブザベーション=10から処理が行われます
  • そのクエリの結果に対してPROC PRINTを実行する際にも、オブザベーション=10から処理が行われます

つまり、FIRSTOBS=システムオプションが2回適用されちゃったわけですね。。

(話それますが、FIRSTOBS=オプションは以下の落とし穴もあって、取り扱い注意)


その他にも「SQLビューはデータセットと違い実態がない」という事に起因して、一部のデータセットオプションが効かない事もあるので、動作について検証が必要です。



その他の落とし穴

他の落とし穴についても別記事で書きました。
SQLビューは同じ変数名が複数あってもエラーにならない


0 件のコメント:

コメントを投稿