LesezeichenAbonnierenRSS-Feed abonnieren
arial34
Fluorite | Level 6

Hallo Liebe Community,

ich versuche gerade einen Stored Process mit Parametern über PROC STP auszuführen. Bei der Übergabe von Parametern bekomme ich allerdings Fehler in %_eg_WeherParam Macro (bzw. mit PROC SQL) , welche ich bis jetzt nicht lösen konnte. Hier ist der Quellcode:

 

Stored Process:

DATA WORK.INPUT;
INFILE datalines;
INPUT location_id location_name : $11.; 
datalines;
1 LOCATION_01
2 LOCATION_02
3 LOCATION_03
4 LOCATION_04
5 LOCATION_05
;;
RUN;

PROC SQL NOPRINT;

CREATE TABLE WORK.TEST AS 
SELECT * FROM WORK.INPUT WHERE 
%_eg_WhereParam(location_id, location, IN, TYPE=N )
;
RUN;

PROC REPORT DATA=WORK.TEST;
RUN;

 

Der Parameter "Location" ist in einer statischen Liste definier (multiple values).

Und hier Mein EG-Programm, welches den Stored Process ausführt:

 

PROC STP PROGRAM="/User Folders/..../SandBox" 

INPUTPARAM LOCATION="1" LOCATION="2"; 

RUN;

 

 

Wenn ich es so ausführe, klappt alles, aber wenn ich nur ein Parameter übergebe kommt eine Fehlermeldung aus dem %eg_WhereParam Macro:

 

PROC STP PROGRAM="/User Folders/..../My Folder/SandBox"

INPUTPARAM LOCATION="1"; 

RUN;

 

 

Fehelermeldung:

 

07 %_eg_WhereParam(location_id, location, IN, TYPE=N )

ISIN=("IN" = "IN")

MPRINT(_EG_WHEREPARAM): location_id IN 1

NOTE 139-205: Line generated by the macro function "UNQUOTE".

207 1

-

22

ERROR 22-322: Syntax error, expecting one of the following: (, SELECT.

NOTE: Line generated by the macro function "UNQUOTE".

207 1

 

 

 

Auch folgender Code führt zum gleichen Fehler:

 

PROC STP PROGRAM="/User Folders/..../My Folder/SandBox"

INPUTPARAM LOCATION;

RUN;

 

 

Hat jemand eine Idee woran es liegen könnte?

 

3 ANTWORTEN 3
mfab
Quartz | Level 8

Hallo @arial34,

 

zunächst sollte das PROC SQL meines Wissens mit einem "QUIT;" beendet werden, anstatt mit einem "RUN;". Das Quit beendet den SQL-Processor und verhindert, dass ggf. weitere Resourcen belegt werden, die nicht mehr belegt sein müssten.

 

Das Problem welches entsteht ist im Log mit folgender Zeile ersichtlich:

MPRINT(_EG_WHEREPARAM): location_id IN 1

 

Ich arbeite nicht mit dem _eg_whereparam Marco, aber wie es scheint wird bei der Eingabe von nur einem Parameter nur die oben stehende Zeile generiert.

Nach dem IN-Operator muss allerdings entweder eine Aufzählung in Klammern erfolgen, also in dem Beispiel "location_id IN (1)" oder eben ein select - "location_id IN select id from [...]"

 

/* Funktioniert nicht: */
PROC SQL NOPRINT;
CREATE TABLE WORK.TEST AS 
SELECT * FROM WORK.INPUT WHERE 
location_id IN 1
;
QUIT;


/* Funktioniert: */
PROC SQL NOPRINT;
CREATE TABLE WORK.TEST AS 
SELECT * FROM WORK.INPUT WHERE 
location_id IN (1)
;
QUIT;

 

Mögliche Lösung wäre demnach entweder das Macro nicht zu verwenden oder davor abzuprüfen, wieviele Parameter geliefert werden. Wird nur ein Parameter geliefert ist statt dem "IN" vielleicht besser ein "EQ" (oder 😃 zu verwenden.

 

Beste Grüße

mfab

GrischaPfister
Fluorite | Level 6
Hallo arial34,



tatsächlich ist der vom Makro %_eg_whereParam() erzeugte Code falsch. Wenn
mehrere Parameter übergeben werden kommt ein korrekter IN-Clause heraus,
wird nur ein Parameter übergeben fehlen die Klammern um die IN Liste. Das
lässt sich durch folgende zusätzliche Zeile im STP herausfinden:



%Put NOTE: code is -> %_eg_WhereParam(location_id, location, IN, TYPE=N );



Zwei Parameter:

NOTE: code is -> (location_id IN ( 1, 1))

Ein Paramter:

NOTE: code is -> location_id IN 1



Der einfachste Workaround ist, immer mindestens zwei Werte für LOCATION
mitzugeben – die dürfen auch durchaus den gleichen Wert haben also z.B.
location=1 location=1, der erzeugte Code sieht dann so aus:



NOTE: code is -> (location_id IN ( 1, 1))



Funktioniert aber problemlos…



Hofffe das hilft weiter,



Viele Grüße,



Grischa



##- Please type your reply above this line. Simple formatting, no
attachments. -##
arial34
Fluorite | Level 6
Danke für die schnelle Antwort. Tatsächlich habe ich es jetzt über ein Zusastzmacro gelöst, welches die Anzah der Parameter überprüft und dann eg_WherPart mit einem EQ aufruft.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

Diskussionsstatistiken
  • 3 Antworten
  • 1398 Aufrufe
  • 0 Kudos
  • 3 in Unterhaltung