Скрипт Windows, чтобы распознать ответное сообщение из SQL, а затем обратный отсчет цикла - PullRequest
0 голосов
/ 19 февраля 2019

Я новичок в мире программирования и начинаю учить себя через Windows Scripts.В данный момент я застрял.

Я использую сценарий Windows для удаления баз данных в SQL Express.Однако, если база данных не удаляется, мне нужно, чтобы скрипт распознал ответ, чтобы он мог запустить цикл обратного отсчета.Как только цикл заканчивается, у меня есть сообщение, отправленное пользователю, что 3 попытки отбросить БД потерпели неудачу.

Итак, если БД не удаляется и мы получаем ответ от SQL, мне нужен сценарий для его перехвата.

Вот пример ответа: Msg 3701, Уровень 11, Состояние 1, Сервер SDFRLPOS003 \ SQLEXPRESS, Строка 1 Не удается удалить базу данных «хранилище данных», поскольку она не существует или у вас нет разрешения.

Мне не нужен сценарий для распознавания КОНКРЕТНОГО ответа от SQL, просто если он получает ЛЮБОЙ ответ от SQL.

Мой сценарий работает вплоть до ответа от SQL (специально нарисован).Я вижу ответ, а затем сценарий завершается.

Любая помощь будет принята с благодарностью!


На основании приведенного выше примера ответа я попытался использовать:

if "%ERRORLEVEL%"=="11" set /a loopcount=loopcount-1
if "%ERRORLEVEL%" > "0" set /a loopcount=loopcount-1
if "%Msg%"=="3701" set /a loopcount=loopcount-1

Вот что у меня есть:

:SQLDropDBStart 
cls
set loopcount=4

:Loop
echo    Deleting DBName Database...     
sqlcmd -S .\SQLEXPRESS -U XXX -P XXX -Q "drop database DBName"

    <<<I DON"T KNOW WHAT TO PUT RIGHT HERE>>>

if %loopcount%==0 goto unableToDropDB
goto    successfulDBDrop    

Мне нужен скрипт, чтобы попытаться отбросить базу данных до завершения цикла.В конце цикла будет goto сообщение о том, что БД не может быть удалена, и будут предоставлены следующие шаги пользователю.

1 Ответ

0 голосов
/ 19 февраля 2019
:SQLDropDBStart
cls
set loopcount=4

:Loop
echo    Deleting DBName Database...
sqlcmd -b -S .\SQLEXPRESS -U XXX -P XXX -Q "drop database DBName"

rem Error is not 1 or greater (success).
if not errorlevel 1 goto successfulDBDrop

rem Decrease count.
set /a "loopcount-=1"

rem End loop (fail).
if %loopcount% equ 0 goto unableToDropDB

rem Sleep time.
ping localhost -n 3 >nul

rem Another loop.
goto :loop

Использует if not errorlevel 1, что не равно 1 или больше.Менее 1 вызывает goto successfulDBDrop.

Если errorlevel равно 1 или больше, loopcount уменьшается на 1. Затем проверяется loopcount, если оно равно 0, и если так, goto unableToDropDB происходит.

Некоторое время сна выполняется с помощью ping (или вы можете альтернативно использовать timeout) перед выполнением другого цикла.

Просмотр if /? для получения дополнительной информации о проверкеerrorlevel число.

Я также добавил -b аргумент в виде служебной страницы sqlcmd состояния:

-b

Указывает, что sqlcmd завершает работу и возвращает значение DOS ERRORLEVEL при возникновении ошибки.Значение, которое возвращается в переменную DOS ERRORLEVEL, равно 1, если сообщение об ошибке SQL Server имеет уровень серьезности больше 10;в противном случае возвращается значение 0. Если параметр -V был установлен в дополнение к -b, sqlcmd не будет сообщать об ошибке, если уровень серьезности ниже значений, заданных с помощью -V.Пакетные файлы командной строки могут проверить значение ERRORLEVEL и соответствующим образом обработать ошибку.sqlcmd не сообщает об ошибках для уровня серьезности 10 (информационные сообщения).

Без -b, errorlevel не может быть установлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...