stefan4711 3 Geschrieben 7. Mai 2021 Melden Teilen Geschrieben 7. Mai 2021 Hallo allerseits, ich habe mal eine Frage an unsere Scripting experten. Ich habe untenstehendes SQL Scriot, welches durch das nachfolgende Batch aufgerufen wird. Ich möchte eine Variable Path, die im Batch definiert wird, an en SQl Aufruf übergeben. Leider funktioniert das noch nicht so ganz, ich gehe davon aus das der Fehler im SQL liegt, wie sage ich dem Script, dass er die dort im Aufruf definierte Variable path übernimmt. DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name -- specify database backup directory /*SET @path = 'C:\Backs\' */ -- specify filename format SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) DECLARE db_cursor CURSOR READ_ONLY FOR SELECT name FROM master.sys.databases WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases AND state = 0 -- database is online AND is_in_standby = 0 -- database is not read only for log shipping OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = $(path) + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor Batchfile: @Echo Off CD /D %~dp0 set "path=c:\sqlback" "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe" -v path="'%path%" S "localhost\db" -i "%~dp0\SQL-SicherungALL_DB.sql" EXIT Über eine Idee würde ich mich sehr freuen lg Stefan Zitieren Link zu diesem Kommentar
winmadness 79 Geschrieben 7. Mai 2021 Melden Teilen Geschrieben 7. Mai 2021 (bearbeitet) "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe" -v path="%path%" -S "localhost\db" -i "%~dp0\SQL-SicherungALL_DB.sql" Ich habe oben erst einmal zwei Fehler in Deinem Batch-Skript korrigiert: 1) das Hochkomma vor %path% entfernt und 2) ein Bindestrich vor dem Parameter "S" hinzugefügt. Ansonsten kann ich kein Fehler auf die Schnelle erkennen. bearbeitet 7. Mai 2021 von winmadness Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 7. Mai 2021 Autor Melden Teilen Geschrieben 7. Mai 2021 (bearbeitet) ok danke, dir, ich gehe ja auch davon aus dass im SQL Script irgendwas fehlt, wenn ich das soi aufrufe kommt folgendes: Zitat Msg 132, Level 15, State 1, Server N181103\db, Line 24 The label 'C' has already been declared. Label names must be unique within a query batch or stored procedure. Msg 132, Level 15, State 1, Server N181103\db, Line 24 The label 'C' has already been declared. Label names must be unique within a query batch or stored procedure. Msg 132, Level 15, State 1, Server N181103\db, Line 24 The label 'C' has already been declared. Label names must be unique within a query batch or stored procedure. bearbeitet 7. Mai 2021 von stefan4711 Zitieren Link zu diesem Kommentar
winmadness 79 Geschrieben 7. Mai 2021 Melden Teilen Geschrieben 7. Mai 2021 Habe im Moment leider kein MS SQL im Zugriff zum Testen. Aber setze mal den folgenden Ausdruck in Deinem SQL Script in Hochkomma: SET @fileName = '$(path)' Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 7. Mai 2021 Autor Melden Teilen Geschrieben 7. Mai 2021 Recht schönen Dank, etwas weiter bin ich jetzt, nur er schreibt die Bachup Files nicht in das Verzeichnis, sondern in C und Bennent sie in diesem Stil: sqlbacktest_20210507.BAK Die Skripte sehen nun wie folgt aus: @Echo Off CD /D %~dp0 set "path=c:\sqlback" if not exist "c:\sqlback" MD "c:\sqlback" "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe" -S "localhost\db" -i "%~dp0\SQL-SicherungALL_DB.sql" PAUSE EXIT SQL: ------------------------------------------------------------- DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name -- specify database backup directory -- specify filename format SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) DECLARE db_cursor CURSOR READ_ONLY FOR SELECT name FROM master.sys.databases WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases AND state = 0 -- database is online AND is_in_standby = 0 -- database is not read only for log shipping OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = '$(path)' + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor Vielen Dank noch mal lg Stefan Zitieren Link zu diesem Kommentar
winmadness 79 Geschrieben 7. Mai 2021 Melden Teilen Geschrieben 7. Mai 2021 (bearbeitet) Hat es einen Grund, warum Du den Parameter "-v" mit der Pfadvariable im Batch-Skript entfernt hast? Was mir noch aufgefallen ist, es fehlt noch ein Backslash vor @name. Den Parameter wieder setzen: "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe" -v path="%path%" -S "localhost\db" -i "%~dp0\SQL-SicherungALL_DB.sql" SQL SET @fileName = '$(path)\' + @name + '_' + @fileDate + '.BAK' bearbeitet 7. Mai 2021 von winmadness Die Legasthenie kickt immer wieder. Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 7. Mai 2021 Autor Melden Teilen Geschrieben 7. Mai 2021 ja es hat einen Grund, die variable wird später noch anders ermittelt, klar so wie das ist könnte ich sie einfach im SQL mit Set setzen. Hab auf die Frage fast schon gewartet, habe das nur der Einfachheithalber auf das nötigste beschränkt. Ich versuchs mal mit dem \ danke lg Stefan Zitieren Link zu diesem Kommentar
winmadness 79 Geschrieben 7. Mai 2021 Melden Teilen Geschrieben 7. Mai 2021 (bearbeitet) DAmit ist die Variable $(path) aber leer und somit wird kein Pfad bei der Erstellung der .bak Datei angegeben. Damit ist es doch logisch, dass die Datei direkt in das Arbeitsverzeichnis geschrieben wird. Also musst Du zum Testen die Variable $(path) mit einem sinnvollen Inhalt belegen. bearbeitet 7. Mai 2021 von winmadness Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 7. Mai 2021 Autor Melden Teilen Geschrieben 7. Mai 2021 na ja der Pfad ist nicht direkt leer, er wird ja in der Batch angegeben mit c:\sqlback @widmadness: Jetzt funktioniert es aber,recht herzlichen Dank schönen Abend noch lg Stefan Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.