2011-06-21 8 views
3

クリーンなセッションでローカルに実行:SASマクロ引用符はフォーマットリテラルとどのように相互作用しますか?

%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の特殊性が関係していますか?

答えて

2

this question on runsubmit.comで回答:

I'm going to mark this answer as correct because it led me to this page of documentation: http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#tw3514-unquote.htm - "In rare cases, masking text with a macro quoting function changes the way the word scanner tokenizes the text ... The word scanner does not use it as the boundary of a literal token in the input stack". Sounds like a bug, frankly, but if the tokenizer algorithm is as ancient and hairy as I imagine, I'd spin it as a quirk too!

3

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

+0

しかし、なぜこのエラーが発生するマクロのコンパイル時に文字列をマスキングするのでしょうか?私は、コードが実行されるまでにすべてのマクロクォートが解決されると期待します。 – jl6

+1

%strはコンパイル時に文字列をマスクし、その兄弟%quoteは実行中に文字列をマスクします。これは、proc SQL、マクロのコンパイルと実行を組み合わせたものです。このホワイトペーパーでは、マクロの引用について多くのことを説明しています。http://www2.sas.com/proceedings/sugi28/011-28.pdf –

1

代わりにフォーマットステートメントを使用できますか?たとえば、これはうまく動作します。

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

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

この例は幾分人工的です。私はいくつかの回避策を認識しています。だから私が本当に求めているのは、このエラーがなぜ発生するのかです。 – jl6

1

何らかの理由で、SASが「ベスト」と思われません。フォーマット。

つまり、私はこれをしようとすると、あなたのコードが

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

の作品????

0

あなたのコードに

%put _user_ ; 

これを追加する場合は、& xは、ログには、%strで引用されている方法について説明します。そのため、SQLコードは機能しません。 proc SQL文のselect部分で%Unquoteを使用すると、コードを実行できます。

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

+0

これは本当に役に立ちます - ありがとう。私はあなたが 'put'の代わりに '%put'を使う必要があると思います。 –

+0

ありがとうございました –

関連する問題