「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 を適用したいので、以下のように明示的に指定する必要があります。
落とし穴②
SQLビュー参照時にシステムオプションが2回適用されてしまうケースがあります。
FROM句のデータセットは、デフォルトでSQLビューと同じライブラリを参照しにいきます。
つまり、SQLビューがTESTライブラリにあるので、「from DT1」は「from TEST.DT1」と置き換えて実行されます。
今回の例では、FROM句に WORK.DT1 を適用したいので、以下のように明示的に指定する必要があります。
proc sql;
create view TEST.PITFALL as
select *
from WORK.DT1;
quit;
|
例えば、システムオプション「FIRSTOBS=」や「OBS=」がそれにあたります。
まずは、システムオプションの「FIRSTOBS=」・・・ではなくデータセットオプションの「FIRSTOBS=」を使った場合の例。
データセットオプションで「firstobs=10」としてるので、PROC PRINTでの出力時にオブザベーション=10から処理が開始されています。これは想定通りです。
では次、システムオプションの「FIRSTOBS=」を使った場合。
「options firstobs=10;」で以降の処理の開始をオブザベーション=10からにしています。
- まずはPROC PRINTでSQLビューを参照した際にクエリ(SELECT文)が動くので、その時にオブザベーション=10から処理が行われます
- そのクエリの結果に対してPROC PRINTを実行する際にも、オブザベーション=10から処理が行われます
つまり、FIRSTOBS=システムオプションが2回適用されちゃったわけですね。。
(話それますが、FIRSTOBS=オプションは以下の落とし穴もあって、取り扱い注意)
- その他にも「SQLビューはデータセットと違い実態がない」という事に起因して、一部のデータセットオプションが効かない事もあるので、動作について検証が必要です
- SQLビュー内に記述した「&X」みたいなマクロ変数は展開された上で保存されます
- 他の落とし穴についても別記事で書きました
0 件のコメント:
コメントを投稿