2016-06-23 13 views
0

PROC SQLでCATX( "|"、a1-a5)を使用しようとすると、SAS 9.4で構文エラーが発生します。SAS PROC SQLでCATXを使用するときの構文エラーSQL

なぜ最初の2つの出力は機能しますが、3番目の出力は失敗しますか?

data test; 
    input a1 $ a2 $ a3 $ a4 $ a5 $; 
    cards; 
    a b c d e 
    f g h i j 
    k l m n o 
    p q r s t 
    u v w x y 
    ; 
run; 

proc sql; 
    select CATX('|',a1,a2,a3,a4,a5) as catx from test; 
quit; 

data test2; 
    set test; 
    catx=CATX('|',OF a1-a5); 
run; 
proc print data=test2; run; 

proc sql; 
    select CATX('|',OF a1-a5) as catx from test; 
quit; 

第PROCのSQLおよびデータ・ステップが期待生成 "| B | C | D | E"、等しかし、第三のproc SQL構文エラーが "A1" で指摘生成:

32 proc sql; 
33  select CATX('|',OF a1-a5) as catx from test; 
          -- 
          22 
ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, (, *, **, +, ',', -, '.', /, <, <=, <>, =, >, >=, ?, AND, BETWEEN, 
       CONTAINS, EQ, EQT, GE, GET, GT, GTT, LE, LET, LIKE, LT, LTT, NE, NET, OR, ^=, |, ||, ~=. 

おかげ

+1

あなたはproc sqlの柔軟性を伸ばしているようです/ sas言語の他の部分との完全な統合。残念なことに明示的なやり方がベストショットになるかもしれません。数十の列を持たない限り、マクロ変数が役立つ可能性があります。 –

答えて

0

あなたは、いくつかの基本SASの機能が完全にサポートされていませんPROC SQLにおけるそれらの壁の一つ直撃しています。先ほどお話したように、連結に必要な列を含むマクロ変数を作成した方がよいでしょう。ここ

は簡単な例です:

proc sql noprint; 
select name into :cols separated by ',' 
from dictionary.columns 
where libname = "WORK" and 
memname = "TEST"; 
quit; 
%put &cols; 
proc sql; 
    select CATX('|',&cols) as catx from test; 
quit; 

元のデータセットがCATX表現に必要ではない列が含まれていてもよいと明らかにあなたのwhere句はより複雑になります。

0

この構文 "OF a1-a5"は、データステップコードにのみ指定されています。 "proc sql" sasプロシージャは、最も単純なSQLコードであり、データ・ステップ・コードと混在することはできません。

関連する問題