次の%IF-%THENステートメントでは、%BQUOTEを使用して、マクロ変数STATEがOR(Oregonを表す)に置換されることによるエラーを防いでいます。マクロプロセッサは、このORを、誤って論理演算子のORと解釈します。
%if %bquote(&state)=%str(OR) %then %put Oregon Dept. of
Revenue;
注: %STRを使用してもこの例は動作しますが、そのようなプログラムは堅牢でなく、良い実装でもありません。&STATEが何に置換されるのか保証できないため、コンパイル時に変数自体の名前をマスクするのではなく、%BQUOTEを使用して実行時にマクロ変数の置換結果をマスクする必要があります。
次の例のDATAステップでは、一重引用符を含む文字値を作成し、その値をマクロ変数に割り当てています。その後のマクロREADITでは、%BQUOTE関数を使用して、一致しない一重引用符を%IF条件として受け取ることを可能にしています。
data test;
store="Susan's Office Supplies";
call symput('s',store);
run;
%macro readit;
%if %bquote(&s) ne %then %put *** valid ***;
%else %put *** null value ***;
%mend readit;
%readit
DATAステップでSusan's Office Supplies
という値をSTOREに割り当てるときに、この文字列を二重引用符で囲むことで、一致しない一重引用符を文字列内で使用できるようにしています。SASは、STOREに次の値を格納します。
CALL SYMPUTルーチンは、一致しない一重引用符を含むこの値を、マクロ変数Sに割り当てます。マクロREADIT内でSを参照するときに%BQUOTE関数を使用しない場合、マクロプロセッサは、%IF条件のオペランドが無効であることを示すエラーメッセージを発行します。
When you submit the code, the following is written to the SAS log:
***valid ***