文字操作関数の戻り値がデフォルトで$200になるルールは必ずしも成立しないから気をつけろという話

いつも以上にマニアックな話ですが、最近発見したことを書きます。
場合によっては予期せぬ結果を生む可能性のある仕様についてです。

ログにあるメッセージをだしたいので、まず msglevelをi にしておきます。
options msglevel=i;


以下のデータセットがあったとします。

data Q1;
X='A';
run;


そこで

data A1;
set Q1;
Y=repeat(X,100);
Z=repeat('A',100);
run;

と書いて実行します。

YもZもやっていることは同じで、文字値'A'を100回繰り返して
「AAAAAAAAA・・・・・・」といった値を入れています。

Y,Zについて、lengthを指定していないため



いつものようにデフォルト$200ルールが適用されます。














さて、ここまではそれでいいのですが、次に

proc sql noprint;
create table A2 as
 select repeat(X,100) as Y
        ,repeat('A',100) as Z
 from Q1;
quit;

を実行するとどうなるでしょうか?

僕はてっきり、先のコードと全く同じ結果になると思っていましたが実際は















変数X由来のYについては長さは200ですが
定数から直に作ったZの長さは200になってません!データステップなら
なっていたのにです!
ちなみにログには何もでません。


SQLで、多数の抽出結果をunionで縦に繋ぎまくる処理を書いている際、
文字切れが生じていて初めて発見しました。


9.2から、lengthの違う変数をSETで縦結合した際、「WARNING」がでるようになりましたが
(ちなみにoptions varlencheck=nowarnででなくもできまし)、

SQLプロシジャ内のunionだと文字切れが生じていてもおかまいなしなので
ゆめゆめ気をつけましょう。

文字切れは怖い













0 件のコメント:

コメントを投稿