script ejemplos ejecutar windows error-handling batch-file sqlcmd

windows - ejemplos - sqlcmd linux



Manejo de errores con Batch File & Sqlcmd (4)

Construí un minilanguage en python para resolver un problema similar. Usando la biblioteca de subprocesos, puede ejecutar su código a través de sqlcmd, luego obtener la salida y cualquier código de error. Analice la salida antes de ponerla en su archivo de texto y, si es necesario, vaya a los estados de reparación de errores. Estos estados pueden modificar el código u opciones y volver a intentar enviarlos a través de sqlcmd. Si todo lo demás falla, envíe un correo electrónico a un humano.

Por supuesto, ya que estaba usando Python de esa manera, no me molesté con sqlcmd en absoluto y simplemente usé las bibliotecas odbc python para una conexión directa a la base de datos. Podría deshacer mis transacciones si tuviera una falla catastrófica, ejecutarla en modo interactivo, a través de un archivo de comando, etc.

Aunque eso es un montón de trabajo. Para una comprobación de errores más simple, simplemente agregue un filtro a su canalización, digamos grep o awk. O hazlo tu mismo con flex.

Tengo un archivo por lotes que ejecuta algunas consultas SELECT usando sqlcmd, coloca los resultados en archivos de texto y los carga en un servidor FTP. Todo está funcionando como debería, que es como me gusta que las cosas funcionen.

Sin embargo, me he estado preguntando qué haría en caso de error. Digamos que alguien cambia la estructura de datos de la base de datos a la que estoy accediendo y no me lo notifica. Si ejecuté una sentencia sqlcmd SELECT y dejé caer el resultado en un archivo de texto, terminaría con un archivo de texto que contiene un error, que luego iría directamente al FTP como si no pasara nada. (He probado esto)

Me gustaría poder verificar si hay errores provenientes de sqlcmd - timeouts, malas credenciales, consultas mal formadas, etc., etc. No estoy seguro de cómo se hace esto o cuál es la "mejor práctica". Siempre podría intentar rastrear el archivo de texto de salida y buscar errores que creo que podrían suceder, pero esto es problemático por varias razones.

¿Alguien tiene alguna experiencia con esto que les gustaría compartir?


Quizás comenzaría poniendo valores de retorno en tu SQL, así:

DECLARE @IsBored bit = 1 ... do work ... SELECT 0 -- Success!

Puede llevarlo un poco más allá y usar bloques TRY / CATCH para atrapar errores y devolver un código de error. Con SQLCMD, puede usar el código de retorno de su SQL como el código de salida de la aplicación, así:

sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" -o "C:/Logs/output.log" -u

Si administrara sus llamadas SQLCMD con algo así como un programador, podría tomar medidas en función de los códigos de devoluciones de SQLCMD. Como solo está usando archivos por lotes, creo que puede hacer algo como esto:

@ECHO OFF sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" -o "C:/Logs/output.log" -u IF %ERRORLEVEL% NEQ 0 ECHO "Error"

¡Buena suerte!


Puede verificar errorlevel devuelto por SQLCMD para ver si falló.

sqlcmd -b <yourscript> IF ERRORLEVEL 1 goto err_handler goto done :err_handler REM handle the error here :done REM script completion code here


for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)

El código anterior recorrerá todos los * .sql en una carpeta. Si se encuentra un error en alguna de las secuencias de comandos, el error se registrará en el archivo output.txt y detendrá el proceso por lotes de inmediato.