marcimarc85
Goto Top

Batch variable in SQL Command übergeben und ausführen

Ich stehe vor einem kleinen Problem. Ich soll einige Variablen, die ich bisher bei einem SQL Backup/Recovery per Batch abfrage, in die Datenbank schreiben. Das soll einfach zu historischen Zwecken diesen, damit man sieht, wann welches Backup mit welchen Paramtern eingespielt bzw. erstellt wurde.
Ich habe das fertige SQL-Kommando von einem Kollegen bekommen. Nun scheitert es bei mir daran die Variablen aus dem Batch-Script in das SQL-Kommando einzufügen und ausziuführen.

Vielleicht kann ja jemand helfen?


Batch Variablen:

%_ip_address%
%_dns_name%
%_scriptname%
%_backup%
%_recovery_file%
%_clear_statistics%
%_useraccdata%


SQL Parameter:

set @in_ip_address = '%_ip_address%';
set @in_dns_name = '%_dns_name%';
set @in_action = '%_scriptname%';
set @in_action_parameter = '%_backup%, recovery file=%_recovery_file%, %_clear_statistics%, %_useraccdata%;
set @in_protocol_version = ''; <= hier nicht relevant, deshalb leer
set @in_version = ''; <= hier nicht relevant, deshalb leer


SQL-Kommando:

call railsys.write_database_changelog_entry(@in_ip_address, @in_dns_name, @in_action, @in_action_parameter, @in_protocol_version, @in_version);

Content-ID: 4382272286

Url: https://administrator.de/contentid/4382272286

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

em-pie
em-pie 24.10.2022 um 10:37:50 Uhr
Goto Top
Moin,

Vorab:
  • Welches DBMS? -> MS SQL, MySQL PostgreSQL, ...
  • Wo hakt es bei dir?
  • Gibt es Fehler?

Wenn MS SQL:
im schlimmstenfall schreibst du alles in eine TExtdatei (Query.sql) und führst das Query mit der SQLCMD.exe aus. Oder du nutzt selbiges Programm mit dem Parameter -Q

Dritte Option:
Nutze die Powershell: die kann, wenn das richtige Modul geladen ist, direkt den SQL-Server ansprechen...

Gruß
em-pie
MarciMarc85
MarciMarc85 24.10.2022 um 12:06:21 Uhr
Goto Top
Sorry. es handelt sich um MySQL. Powershell wäre ne Option, aber das Ursprungs Batch-Script is etwas länger und schon recht tief verankert mit anderen Scripten. da würde ich jetzt ungern alles auf Powershell krempeln.

Die Idee mit dem Schreiben in eine temporäre SQL-Datei und diese dann mit sqlcmd aus dem Batch zu starten, hatte ich auch. Nur wie eingangs erwähnt bin ich kein Spezialist, was MySQL betrifft. Bei mir hakt es schon an der Stelle die Variablen in den korrekten Befehl in die temporäre Datei zu übertragen.
em-pie
Lösung em-pie 24.10.2022 aktualisiert um 12:15:16 Uhr
Goto Top
OK.

Dein erstes Problem:
Mit SET definierst du ja auch innerhalb der Batch Variablen
 SET var="Set"  
echo %var%

demnach wäre ein
echo set @in_ip_address = '%_ip_address%'  
sinnvoller

am Ende, um über eine *.sql-Datei zu gehen:
%_ip_address%
%_dns_name%
%_scriptname%
%_backup%
%_recovery_file%
%_clear_statistics%
%_useraccdata%


REM SQL Parameter:
(
echo set @in_ip_address = '%_ip_address%';  
echo set @in_dns_name = '%_dns_name%';  
echo set @in_action = '%_scriptname%';  
echo set @in_action_parameter = '%_backup%, recovery file=%_recovery_file%, %_clear_statistics%, %_useraccdata%;  
echo set @in_protocol_version = ''; <= hier nicht relevant, deshalb leer  
echo set @in_version = ''; <= hier nicht relevant, deshalb leer  
)>>%userprofile%\Desktop\test.sql

ausführen kannst du das dann z. B. wie hier beschrieben, über die mysql.exe
https://stackoverflow.com/questions/8830773/run-mysql-script-by-batch-sc ...
MarciMarc85
MarciMarc85 24.10.2022 um 13:52:37 Uhr
Goto Top
Zitat von @em-pie:

OK.

Dein erstes Problem:
Mit SET definierst du ja auch innerhalb der Batch Variablen
 SET var="Set"  
echo %var%

demnach wäre ein
echo set @in_ip_address = '%_ip_address%'  
sinnvoller

am Ende, um über eine *.sql-Datei zu gehen:
%_ip_address%
%_dns_name%
%_scriptname%
%_backup%
%_recovery_file%
%_clear_statistics%
%_useraccdata%


REM SQL Parameter:
(
echo set @in_ip_address = '%_ip_address%';  
echo set @in_dns_name = '%_dns_name%';  
echo set @in_action = '%_scriptname%';  
echo set @in_action_parameter = '%_backup%, recovery file=%_recovery_file%, %_clear_statistics%, %_useraccdata%;  
echo set @in_protocol_version = ''; <= hier nicht relevant, deshalb leer  
echo set @in_version = ''; <= hier nicht relevant, deshalb leer  
)>>%userprofile%\Desktop\test.sql

ausführen kannst du das dann z. B. wie hier beschrieben, über die mysql.exe
https://stackoverflow.com/questions/8830773/run-mysql-script-by-batch-sc ...

Das sieht schon sehr gut aus. Danke . Das Einzige problem, was ich jetzt noch habe, ist der Befehl im SQL-Script, welches den eintrag in die Datenbank schreibt. Wenn ich denn als Variable im Batch-Script definiere, funktioniert das nicht.

set _sql_cmd=call db.write_database_changelog_entry(@in_ip_address, @in_dns_name, @in_action, @in_action_parameter, @in_protocol_version, @in_version);
MarciMarc85
MarciMarc85 26.10.2022 um 14:29:38 Uhr
Goto Top
Hat sich erledigt. Hab es nun final hinbekommen und nun funktioniert alles, wie es soll. Danke!