DOS: Variable aus SQL-Query befüllen

Hallo,
ich habe sonst mit DOS wenig zu tun, nun brauche ich aber folgendes:
Meine SQL-Abfrage liefert 1 Wert, welchen ich in eine Variable schreiben will, um diese weiter zu verwenden.

Warum funktioniert das:
FOR /F „usebackq tokens=1“ %%i IN ( sqlcmd -E -S ServerName -d DataBaseName -h -1 -Q "Select P from dbo.table where name = N'x';") DO echo %%i
==> das Ergebnis wird richtig angezeigt

… und das nicht?
FOR /F „usebackq tokens=1“ %%i IN ( sqlcmd -E -S ServerNaem -d DataBaseName -h -1 -Q "Select P from dbo.table where name = N'x';") DO set PW=%%i
echo %PW%
==> Ergebnis: PW=

Warum funktioniert das Zuweisen zu der Variablen nicht?

Bitte um Hilfe,
danke im Vorraus!

Warum funktioniert das:
FOR /F „usebackq tokens=1“ %%i IN ( sqlcmd -E -S ServerName -d DataBaseName -h -1 -Q "Select P from dbo.table where name = N'x';") DO echo %%i
==> das Ergebnis wird richtig angezeigt

… und das nicht?
FOR /F „usebackq tokens=1“ %%i IN ( sqlcmd -E -S ServerNaem -d DataBaseName -h -1 -Q "Select P from dbo.table where name = N'x';") DO set PW=%%i
echo %PW%
==> Ergebnis: PW=

Warum funktioniert das Zuweisen zu der Variablen nicht?

k.A. Kann das was ich getestet habe nicht so richtig deuten, vielleicht hilft es dir.
Ich habe dies Batch geteset:

echo A > k:\test.txt
for %%A in („huhu“ „haha“ „hoho“) do echo %%A >> k:\test.txt
echo B >> k:\test.txt
for %%A in („huhu“ „haha“ „hoho“) do set PW=%%A
echo %PW% >> k:\test.txt
echo Ende >> k:\test.txt

und die Ausgabe in k:\test.txt ist

A
„huhu“
„haha“
„hoho“
B
„hoho“
Ende

Scheinbar ist die Logik so wie auch in anderen Sprachen, wenn man schreibt:

x=5
X=7
x=9
Echo x

so wird immer 9 angezeigt.
Um das zu vermeiden halt nach jeder x-Änderung wie gleich gesagt eine Unter-batch aufrufen…

Du könntest das problem so lösen daß du mit Do eine batch aufruft der du %%i als parameter mitgibst und in dieser batch erfolgt dann Echo %%1 bei jedem Aufruf.

Gruß
Reinhard

Hallo Reinhard,

an sich ist Dein Ergebnis für mich nachvollziebar:
-) Im Falle A loopt er durch 3 Ergebnisse („huhu“ „haha“ „hoho“) und schreibt sie in der Schleife nach einander in das Textfile.

-) Im Falle B loopt er ebenfalls durch die 3 Ergebnisse. Da die Variable aber immer nur 1 Wert halten kann und du sie erst NACH Schleifenende aufrufst, steht klarerweise der letzte Wert drin.

Wenn ich das also so ändere, dass im Fall B das SET UND das ECHO innerhalb der Schleife liegen -

echo B >> test.txt
for %%A in („huhu“ „haha“ „hoho“) do (set PW=%%A
echo %PW% >> test.txt)
echo Ende >> test.txt

  • dann schaut das Commandfenster bei Ausführung so aus:

Y:\path>>test.txt
>
Y:\path>>test.txt
>
Y:\path>>test.txt
>
Y:\path>echo Ende 1>>test.txt

Dh man sieht schon, dass er durch die Schleife loopt und dass die Variable nacheinander mit den 3 Werten befüllt wird. Im Textfile kommt aber nichts davon an:

B
ECHO ist eingeschaltet (ON).
ECHO ist eingeschaltet (ON).
ECHO ist eingeschaltet (ON).
Ende

Was leider immer noch nicht klärt, wie ich die Variable mit dem Rückgabewert des Statements befüllen kann…

Klar, ich kann die Lösung mit dem Textfile machen (Wert in ein Textfile schreiben, von dort in meine Variable auslesen, Textfile löschen) - aber geht das bitte nicht auch eleganter? Direkt? Ohne doofes Textfile dazwischen??

Vielleicht hat ja wer noch eine Idee dazu?

Klar, ich kann die Lösung mit dem Textfile machen (Wert in ein
Textfile schreiben, von dort in meine Variable auslesen,
Textfile löschen) - aber geht das bitte nicht auch eleganter?
Direkt? Ohne doofes Textfile dazwischen??

Hallo DN,

in meinem WinXP ist Dos so eingestellt daß da das Dos-Fenster nicht bestehen bleibt ohne daß ich Pause o.ä. benutze, deshalb benutze ich die Umleitung in eine txt.

Ich habe jetzt mal was getestet,

@echo off
for %%A in (dir k:*.*) do if %%A==k:\dir.txt echo %%A ohne Set > k:\test1.txt
for %%A in (dir k:*.*) do if %%A==k:\dir.txt set SW=%%A mit Set
echo %SW%>>k:\test1.txt
cls
type k:\test1.txt
pause

Und da ich die datei dir.txt nur einmal in K:\ habe gibt es nur einen Treffer und da gibt sich mit oder ohne Set nix.

Was willst du eigentlich mit der Umgebungsvariablen SW machen?
SW steht da nur kurzfristig drin.

Ich habe z.B. K: mittels Subst angelegt durch eine batch und K: steht für einen längeren Verzeichnispfad.
Das klappt bei mir und alle Programme erkennen K: da ich die batch in den Autostart ordner von Win gestellt habe.

Würde ich im laufenden Betrieb die gleiche batch starten und danach eine andere die mit Set die Umgebungsvariablen anzeigt wäre K: nicht dabei.

Sehr möglichereise könnte man das in einer batch mit
cmd /c subst
o.ä. trotzdem im laufenden Betrieb ermöglichen, ich habs zumindest nicht hingekriegt.

Ich kenne mich mit SQL, Access o.ä. Datenbank abfragen nicht aus.
Schreib mal was du eigentlich bezweckst, ggfs. können dir andere hier helfen das was du willst zu erreichen die sich mit SQL auskennen.
Oder muß es unbedingt Dos sein, wenn ja warum?

Gruß
Reinhard

Schreib mal was du eigentlich bezweckst, ggfs. können dir
andere hier helfen das was du willst zu erreichen die sich mit
SQL auskennen.
Oder muß es unbedingt Dos sein, wenn ja warum?

Hallo Reinhard,

leider muss es ein Batchfile sein, weil wir damit unsere Essbase-Cubes automatisieren wollen. Dazu will ich ein Passwort vom SQL-Server auslesen und es per Variable an die Essbase-Console übergeben.

Wenn ich die Variable über den Umweg eines Textfiles belade, funktioniert auch alles. Dh das Auslesen aus dem SQL-Server und die Übergabe an essmsh funktioniert sehr gut.

Einzig der Umweg über das Textfile nervt mich!
Und genau (und nur) darauf bezieht sich meine Frage: wie kann ich einen Wert, der von einem SQL-Query geliefert wird, in eine Batch-Variable schreiben - und das möglichst ohne Umweg per File.

lg
DN

Hallo.

… und das nicht?
FOR /F „usebackq tokens=1“ %%i IN ( sqlcmd -E -S ServerNaem -d DataBaseName -h -1 -Q "Select P from dbo.table where name = N'x';") DO set PW=%%i
echo %PW%
==> Ergebnis: PW=

Unter Dos dürfte das so gar nicht laufen, scheint eher ein Batch-File für die cmd.exe von XP oder ähnliches zu sein.

Du musst die „delayed expansion“ aktivieren für deine Shell. Das geht entweder generell oder innerhalb der Batch mit dem Befehl „setlocal /enabledelayedexpansion“.

Sebastian.