2016-06-23 17 views
0

Ich erzeuge einen Syntaxfehler in SAS 9.4 beim Versuch, CATX ("|", von a1-a5) in PROC SQL zu verwenden.Syntaxfehler mit CATX in SAS PROC SQL

Warum funktionieren die ersten beiden Ausgänge, aber der dritte schlägt fehl?

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; 

Die erste proc sql und die Daten Schritt produzieren die erwartete "a | b | c | d | e", etc. Aber die dritte proc sql erzeugt ein Syntaxfehler bei der "a1" spitz:

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, ^=, |, ||, ~=. 

Dank

+1

Scheint so, als würden Sie die Flexibilität/vollständige Integration von proc sql mit anderen Teilen der sas-Sprache dehnen. Der explizite Weg könnte hier leider der beste sein. Es sei denn, Sie haben Dutzende von Spalten, in diesem Fall könnte eine Makrovariable hilfreich sein. –

Antwort

0

Sie haben eine dieser Wände treffen in Proc SQL, wo einige Basis SAS-Funktionen nicht vollständig unterstützt werden. Wie bereits erwähnt, sollten Sie besser eine Makrovariable erstellen, die die Spalten enthält, die Sie für Ihre Verkettung benötigen.

hier ist ein kurzes Beispiel:

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; 

Offensichtlich Ihre where Klausel wird als Ihre ursprüngliche Datensatz komplexer sein können Spalten nicht erforderlich im CATX Ausdruck enthält.

0

Diese Syntax "OF a1-a5" wird nur für Datenschrittcode angegeben. "proc sql" sas procedure ist ein einfacher SQL-Code und kann nicht mit Data-Step-Code gemischt werden.