2017年11月6日月曜日

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




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



落とし穴①

以下は「TEST.PITFALL」という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;


続いて、この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;


データセットオプションで「firstobs=10」としてるので、PROC PRINTでの出力時にオブザベーション=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ビュー内に記述した「&X」みたいなマクロ変数は展開された上で保存されます

  • 他の落とし穴についても別記事で書きました



0 件のコメント:

コメントを投稿