Ich habe eine Batch-Datei eingerichtet, die einen SQL-Befehl verwendet, der an eine Befehlsdatei übergeben wird. Wenn ich diese Variable aufrufe, wird die Zeile jedoch nicht angezeigt. Ich erhalte die Fehlermeldung "SQL-Befehl nicht erkannt".
In meiner Datei mache ich so etwas:
ECHO OFF
set vSQL=%~2
echo %vSQL%
Das SQL - Variable I in die Datei am Übergang enthält eine weniger als Betrieb: select * from sometable where c3 < 999999999
.
Ich habe versucht, das ^
zu diesem hinzuzufügen ...c3 ^< 999999999
, aber das hat immer noch nicht funktioniert. Ich bekomme den gleichen Fehler. Gibt es eine andere Möglichkeit, <
eine Batch-Datei zu verwenden?
Und ja, ich bin sicher, dass es der Teil der Datei ist, der das Problem verursacht. Ich habe die gesamte SQL-Operation in sqldeveloper ausgeführt, wo sie einwandfrei funktioniert hat.
quelle
Antworten:
Der Batch-Parser verwendet Folgendes, um Parameter zu begrenzen:
<space>
<tab>
;
,
=
<0xFF>
Das letzte Zeichen ist ein nicht unterbrechendes Leerzeichen.Es ist unmöglich, die Parameterbegrenzer in der Befehlszeile zu umgehen. Die einzige Möglichkeit, ein Trennzeichen in einen Parameterwert aufzunehmen, besteht darin, den gesamten Parameter in doppelte Anführungszeichen zu setzen.
So können Sie Ihr Skript aufrufen mit:
yourScript.bat "select * from sometable where c3 < 999999999"
. Da die<
jetzt zitiert ist, müssen Sie sich keine Sorgen mehr machen, dass Sie nicht entkommen.Die Anführungszeichen gelten als Teil des Wertes. Wenn Sie den
~
Modifikator in verwenden,%~2
werden die umgebenden Anführungszeichen aus dem Parameterwert entfernt. Aber jetzt musst du dir Sorgen machen, ob du das Requotieren oder Entkommen willst<
. Das einfachste , was zu tun ist Anführungszeichen Ausdruck um den gesamten Zuordnung hinzuzufügen:set "vSQL=%~2"
. Auf diese Weise schützen die Anführungszeichen<
den Wert, sind jedoch nicht im Wert enthalten.Wenn es an der Zeit ist, die Variable zu verwenden, müssen Sie sich erneut um den
<
Charakter kümmern . In diesem Fall ist es am einfachsten, die verzögerte Erweiterung zu aktivieren und zu verwenden.quelle
0x255 That last character is a non-breaking space.
Ich nehme an, du meintest0xff
da0x255
eigentlichɕ
(Latin Small C With Curl). Trotzdem ist es kein wirklich ununterbrochener Raum. Das echte NBSP befindet sich am Unicode-Code-Punkt 0xa0. Das Zeichen an 0xff ist Code-Seite abhängig und könnte seinے
,˙
,я
etc., ist aber oftÿ
. Es wird manchmal als "Non-Break-Space" bezeichnet, weil es in den alten DOS-Zeiten von vielen (aber nicht allen) Programmen als Leerzeichen angezeigt , aber (in gewisser Weise) wie ein normales Zeichen behandelt wurde, aber selbst dann war es eine Codepage abhängig.ÿ
. Ich muss prüfen, ob ich es jemals in Argumenten verwendet habe, da es in Windows kaputt gehen würde. Ich frage mich auch, wie CMD damit umgeht, wenn Sie eine Codepage verwenden, in der es kein Leerzeichen gibt (ichchcp
ツ
charmap
nennt esno-break space
).