2017-06-05 4 views
1

Ich habe eine Makrovariable, die ich in PROC SQL verwenden muss. Die Art, wie es aufgelöst wird, scheint eine perfekte Syntax zu haben, aber ich bekomme einen Syntaxfehler, und ich bin mir nicht sicher warum;Auflösen von Makrovariablen in 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; 

Der Fehler, den ich bekommen wirft eine rote Linie unter dem aufgelösten Text, 'mytext' und sagt

ERROR 22-322: Syntaxfehler, erwartet Sie eine der folgenden: einen Namen , eine Zeichenfolge in Anführungszeichen, eine numerische Konstante, eine Datetime-Konstante, ein fehlender Wert, (, *, +, -, ALLE, BELIEBIG, BTRIM, CALCULATED, CASE, EINGABE, PUT, SELECT, EINIGE, SUBSTRING, ÜBERSETZEN, USER

Ich glaube nicht, dass dieser Fehler hier gilt. Wenn ich 'Mytext' hart eincodiert, funktioniert es gut. Fehle ich etwas direkt unter meiner Nase? Kann mir jemand helfen?

Danke !!!

+0

Wir empfehlen die Verwendung von [tag: entrepreneure-guide] -Tag nicht, es sei denn, Sie fragen nach EG-Funktionalität (im Gegensatz zur SAS-Sprachfunktionalität). – Joe

Antwort

1

Die BQUOTE-Funktion versucht, den Wert sofort zur Ausführungszeit aufzulösen. Versuchen Sie, es zu entfernen und stattdessen doppelte Anführungszeichen zu verwenden:

+0

Dies erzeugt den gleichen Fehler, diesmal zeigt meine gewünschte Ausgabe mit doppelten Anführungszeichen –

+0

HINWEIS: Linie von der Makrofunktion "BQUOTE" generiert. 77 "Mytext" Dies zeigt sich vor dem Fehler –

+0

Entschuldigung ja - 'bquote' ist ein lustiger! Antwort aktualisiert –

2

Die Makroquotation verwirrt den SAS-Parser. Für dieses Programm würde ich die Verwendung von entfernen und einfach doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwenden, so dass die Makrovariablenreferenz aufgelöst wird.

WHERE a.column = "&test" 

Wenn Ihr tatsächlich in ein System passieren durch SQL erzeugt, das die Verwendung von einfachen Anführungszeichen für Stringliterale erfordert, dann müssen Sie %unquote() verwenden, unter Angabe der Makro zu entfernen.

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

Ich verwende immer% bquote ohne Fehler, wenn ich Pass-Throughs habe. Ich hätte geschworen, dass ich zuerst doppelte Anführungszeichen ausprobierte und Probleme hatte, bevor ich dieses Problem veröffentlichte. Ich muss es Allan allerdings geben, da er zuerst antwortete! Danke, Tom! –