Получение ошибок из Sqlcmd в скрипте PowerShell - PullRequest
0 голосов
/ 08 июня 2019

Я работаю на государственного клиента, и наши развертывания контролируются другим подрядчиком, который попросил предоставить сценарии powershell для запуска сценариев нашей базы данных.К сожалению, безопасность жесткая, и у меня нет прав на добавление оснасток powershell, поэтому я должен использовать старый добрый sqlcmd вместо Invoke-Sqlcmd.У меня возникли проблемы с получением ошибок, возникающих при запуске сценариев, для передачи обратно в powershell.

Например, представьте в сценарии ниже, что «02 test2.sql» имеет ошибку, из-за которой он не запускается.Я хотел бы, чтобы это завершить сценарий, записать сообщение на консоль, а также записать вывод sqlcmd в файл.Независимо от того, что я пытаюсь, мне кажется, что PowerShell не может распознать ошибку sqlcmd.

function TerminateScript {
    ECHO "Please email `"Production.log.txt`" to address@mail.com"
    Read-Host -Prompt "Press Enter to exit"
    exit 1
}

ECHO "Running `"01 test1.sql`"" | tee -a Production.log.txt
sqlcmd -r -b /S serverName /d dbName -i "01 test1.sql" >> Production.log.txt
if ($LASTEXITCODE -ne 0) {
    Write-Error "Error occured while running `"01 test1.sql`". Terminating script."
    TerminateScript
}

ECHO "Running `"02 test2.sql`"" | tee -a Production.log.txt
sqlcmd -r -b /S serverName /d dbName -i "02 test2.sql" >> Production.log.txt
if ($LASTEXITCODE -ne 0) {
    Write-Error "Error occured while running `"02 test2.sql`". Terminating script."
    TerminateScript
}

ECHO "Running `"03 test3.sql`"" | tee -a Production.log.txt
sqlcmd -r -b /S serverName /d dbName -i "03 test3.sql" >> Production.log.txt
if ($LASTEXITCODE -ne 0) {
    Write-Error "Error occured while running `"03 test3.sql`". Terminating script."
    TerminateScript
}

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Ваш метод должен работать, если вы просто перенаправляете нужные выходные потоки в ваш файл.>> по умолчанию только перенаправляет поток успеха.Поток ошибок 2 (2>>).Все потоки * (*>>).Если вы хотите перенаправить только потоки ошибок и успехов, вы можете отправить поток ошибок в поток успеха, а затем отправить поток успеха в ваш файл через 2>&1 >> Production.log.txt.$LastExitCode все равно предоставит 1, если запрос выдаст ошибку.

Пример: перенаправление всех потоков

ECHO "Running `"02 test2.sql`"" | tee -a Production.log.txt
sqlcmd -r -b /S serverName /d dbName -i "02 test2.sql" *>> Production.log.txt
if ($LASTEXITCODE -ne 0) {
    Write-Error "Error occured while running `"02 test2.sql`". Terminating script."
    TerminateScript
}

Пример: ошибка перенаправленияи потоки успеха

sqlcmd -r -b /S serverName /d dbName -i "02 test2.sql" 2>&1 >> Production.log.txt

Я знаю, что это НЕ именно то, что вы хотите, но это альтернатива.Вы можете использовать Start-Process для вызова sqlcmd и перенаправления потоков ошибок и успехов.Имейте в виду, что выходные файлы перезаписываются при каждом запуске.Файл error.txt будет пустым, если не было ошибок.

Start-Process sqlcmd -ArgumentList "-r -b /S poc-vtxrtndb2 /d test -i `"02 test2.sql`"" -NoNewWindow -RedirectStandardError error.txt -RedirectStandardoutput log.txt
if (Get-Content error.txt) {
    "There was an error in the script"
}

См. About_Redirection для получения дополнительной информации о перенаправлении вывода PowerShell.

0 голосов
/ 08 июня 2019

Не уверен, если Invoke-Sqlcmd выдает исключение, но если это так, вы можете перехватить и записать его:

try {
   Invoke-Sqlcmd ... -ErrorAction Stop -Verbose *>> Production.log
} catch {
   Write-Error $_
   Write-Error "Exception: $($_.Exception)"
}

Docu :

Можно отобразить выходные данные сообщений SQL Server, например, те, которые являются результатом оператора SQL PRINT, указав параметр Verbose.

Через *>> мы перенаправляем и присоединяем все потоки PowerShell в файл.

Надеюсь, это поможет.

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