2017-06-05 7 views
1

PROC SQL内で使用する必要があるマクロ変数があります。それが解決する方法は完全な構文を持っているように見えますが、構文エラーが発生しています。PROC内部でマクロ変数を解決するSQL

%let test = mytext; 
PROC SQL; 
CREATE TABLE myTalbe&test AS 
SELECT DISTINCT 
    a.column 
FROM 
    tablename a 
WHERE 
    a.column = %bquote('&test') 
;QUIT; 

私が手にエラーが解決されたテキスト、'MYTEXT'の下に赤い線をスローし、

ERROR 22から322の言葉:構文エラーは、次のいずれかの期待:名前を、 引用符付き文字列、数値定数、日時定数、 欠損値、(、*、+、 - 、ALL、ANY、BTRIM、CALCULATED、CASE、INPUT、PUT、SELECT、SOME、SUBSTRING、TRANSLATE、 USER。

ここにこのエラーが当てはまるとは思わない。 'mytext'にハードコードすると問題なく動作します。私の鼻の下に何かが見当たりませんか?誰も私に手を貸すことができますか?

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

+0

私たちは、[エンタープライズガイドタグ]の使用を奨励していません。 – Joe

答えて

1

BQUOTE関数は、実行時にすぐに値を解決しようとします。それを削除し、代わりに二重引用符を使用してみてください。

%let test = mytext; 
PROC SQL; 
CREATE TABLE myTalbe&test AS 
SELECT DISTINCT 
    a.column 
FROM 
    tablename a 
WHERE 
    a.column = "&test" 
;QUIT; 
+0

これは同じエラーを生成し、今回は二重引用符で希望の出力を表示します –

+0

注:マクロ関数 "BQUOTE"によって生成された行。 77 "mytext" エラーの前に表示されます –

+0

apolog yes - 'bquote'は面白いです!回答が更新されました –

2

マクロ引用符で囲まれていると、SASパーサーが混乱します。このプログラムでは、私は%bquote()の使用を取り除き、マクロ変数参照が解決するように一重引用符の代わりに二重引用符を使用するだけです。

WHERE a.column = "&test" 

あなたが実際にあなたが引用したマクロを削除するために%unquote()を使用する必要があります文字列リテラルのための単一引用符の使用を必要とするシステムにSQLパススルー生成する場合。 (SAS言語機能とは反対に)あなたはEGの機能について尋ねていない限りタグ:

... from connection to ... (... 
WHERE a.column = %unquote(%bquote('&test')) 
...) ... 
+0

私はパススルーを持っているときは常に%bquoteを必ず使用します。この問題を投稿する前に、二重引用符を最初に試してみて欲しいと言っていました。彼が最初に答えたので、私はアランにそれを与えなければならない!ありがとう、トム! –

関連する問題