Как выйти из цикла for, если в цикле произошла ошибка какой-либо команды - PullRequest
0 голосов
/ 21 апреля 2019

Я развертываю sql dacpac на всех базах данных по одной, помещая их в текстовый файл и используя для loop , я хочу остановить развертывание, если какая-либо база данных не смогла развернуться успешно.

Я создал один пакетный скрипт, как показано ниже

"SQLCMD.EXE" -S DB -U user -P password -Q "SELECT name FROM master.dbo.sysdatabases Where [name] NOT IN ('master', 'tempdb', 'model', 'msdb')" -o alldb.txt

for /f "delims=" %%x in (alldb.txt) do (
    "SqlPackage.exe" /Action:Publish /SourceFile:"dacpac" /TargetDatabaseName:"%%x" /TargetServerName:"DB" /TargetUser:"user" /TargetPassword:"password"
    if %errorlevel% neq 0 exit /b %errorlevel% 
)

когда я запускаю этот пакетный файл, выполняется команда if вместе с командой sqlpackage.exe, как показано ниже

"SqlPackage.exe" /Action:Publish /SourceFile:"dacpac" /TargetDatabaseName:"DB name" /TargetServerName:"DB" /TargetUser:"user" /TargetPassword:"password"

 if 0 neq 0 exit /b 0

поэтому развертывание начнется на следующем БД, даже если предыдущее развертывание БД было неудачным.

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

1 Ответ

0 голосов
/ 21 апреля 2019

Ниже синтаксис работал для меня.

for /f "delims=" %%x in (alldb.txt) do (
   "SqlPackage.exe" /Action:Publish /SourceFile:"dacpac" /TargetDatabaseName:"%%x" /TargetServerName:"DB" /TargetUser:"user" /TargetPassword:"password" || echo ERROR && exit /b
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...