Jump to content

Variable aus CMD an SQLCMD übergeben


Recommended Posts

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 to post
"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.

Edited by winmadness
Link to post
Posted (edited)

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.

 

 

Edited by stefan4711
Link to post

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 to post

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'

 

Edited by winmadness
Die Legasthenie kickt immer wieder.
Link to post

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

Link to post

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.

Edited by winmadness
Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...