3

クリーンセッションでローカルに実行する:

%let x = %str(put(age, best.));

proc sql;
    select &x from sashelp.class;
quit;

これにより、次のエラーが生成されます。

1     put(age, best.)
               ----
               22
                ----
                76
ERROR 22-322: Syntax error, expecting one of the following: a format name, ?.

ERROR 76-322: Syntax error, statement will be ignored.

ただし、この「手動で解決された」バージョンは、メモ、警告、またはエラーなしで実行されます。

proc sql;
    select put(age, best.) from sashelp.class;
quit;

誰かが、実行時に問題を引き起こすこのプログラムで%str()が何をしているのかを正確に説明できますか?漠然とした質問をお詫びしますが、関連するやり取りが何であるかはわかりません。同等のデータステップ構文を使用して複製できないので、おそらくproc SQLの特性が関係していますか?

4

5 に答える 5

3

%str() 関数は、マクロのコンパイル中に文字列をマスクします。let ステートメントの %str() 関数を削除するか、sql select に %unquote() 関数を追加して、if が正しく解決されるようにします。

于 2011-06-21T12:56:46.903 に答える
2

runsubmit.com のこの質問に回答:

ドキュメントのこのページにたどり着いたので、この回答を正しいものとしてマークします。 unquote.htm - 「まれに、マクロ引用関数でテキストをマスキングすると、ワード スキャナがテキストをトークン化する方法が変更されます... ワード スキャナは、入力スタック内のリテラル トークンの境界としてそれを使用しません」. 率直に言って、バグのように聞こえますが、トークナイザーのアルゴリズムが私が想像するほど古くて毛むくじゃらである場合、私もそれを奇妙だと思います!

于 2011-06-22T19:50:25.407 に答える
1

代わりにformatステートメントを使用できますか?たとえば、これは問題なく機能します。

%let x = %str( age format=best.);

proc sql;
    select &x. from sashelp.class;
quit;
于 2011-06-21T12:59:51.077 に答える
1

何らかの理由で、SAS は「最高」が好きではありません。フォーマット。

つまり、これを試すと、コードが機能します

 %let x = %str(put(age, 8.));

????

于 2011-06-21T15:03:32.107 に答える
0

これをコードに追加すると

%put _user_ ;

ログで &x が %str によってどのように引用されているかを確認できます。これが、proc SQL コードが機能しない理由です。proc sql ステートメントの選択部分で %Unquote を使用すると、コードを実行できます。

http://www2.sas.com/proceedings/forum2007/152-2007.pdf

于 2011-07-19T23:41:48.253 に答える