2016-05-05 23 views
2

以下のコードでは、電子メールが常に送信されます。 1は明らかに0に等しくはありませんが、まだ実行されています。私はdo部を削除しようとしましたが、それでも同じ問題が発生します。SASデータステップが正しく動作しない場合

data _null_; 
set TestTable; 
if 1 = 0 then do; 
    file sendit email 
    to=("[email protected]") 
    subject="Some Subject Line"; 
end;  
run; 
+0

私はあなたが0に1を比較することによって、何をしようとしてわからないんだけど、多くの言語は、そのような2つのリテラル定数を比較扱えないでしょう。 – TriskalJM

+0

私はそこに置いても、いつも電子メールを送信するので、私はそれを使ってテストしていました。 –

+1

@TriskalJM SASはその構造で問題ありません。 (私はより短い 'if 0'を使いますが、' if 1 = 0'はうまくいきます。) – Joe

答えて

7

file文は実行文とみなされる(したがって際に虚偽の陳述ifの後ろに実行すべきではない)、それは本当に全く真実ではないですが。 SASはコンパイル中にfile文を見て、書き込み先のファイルを作成する必要があることを知っているので、ややコンパイル時です。それはここで起こっていることです - SASは、コンパイラの活動の結果としてファイル(この場合は電子メール)を作成し、実際には何も投入しませんが、終わりにはまだ電子メールを持っています。

同じことが他のファイルで発生 - そのように:

data _null_; 
    set sashelp.class; 
    if 0 then do; 
     file "c:\temp\test_non_zero.txt"; 
     put name $; 
    end; 
run; 

空白のファイルがそのコードによって作成されます。

条件付きで電子メールを送信する必要がある場合は、電子メールコードをマクロにラップし、そのマクロをcall executeなどを使用してデータセットから呼び出すことをおすすめします。ように:

%macro write_email(parameters); 
data _null_; 
    file sendit email 
    to=("[email protected]") 
    subject="Some Subject Line"; 
run; 
%mend write_email; 

data _null_; 
    set TestTable; 
    if 0 then do; 
    call execute('%write_email(parameters)'); 
    end; 
run; 
+0

興味深い洞察力、ありがとう! – mjsqu

関連する問題