Jump to content

Variable aus CMD an SQLCMD übergeben


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar
"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 von winmadness
Link zu diesem Kommentar

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 von stefan4711
Link zu diesem Kommentar

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

Link zu diesem Kommentar

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 von winmadness
Die Legasthenie kickt immer wieder.
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...