Захват в PowerShell другого кода выхода sqlcmd для проблем с подключением / данными

Я вызываю sqlcmd из PowerShell для выполнения сценария T-SQL. В настоящее время я использую «: При выходе из ошибки» для выхода из скрипта, если есть ошибка, вызванная нарушением ограничений данными используемыми данными и т. Д. Это обрабатывается PowerShell, обнаруживающим $ SqlcmdProcess.ExitCode равным 1.

Однако, если есть проблема с подключением к базе данных, sqlcmd также выдает ExitCode равным 1. Есть ли способ установить: On Error ExitCode на другое значение, кроме 1? Я знаю, что для этого я использую что-то вроде: Exit (SELECT 2), но я бы предпочел использовать: On Error, поэтому мне не нужно переписывать скрипт.


person user1551288    schedule 25.07.2012    source источник


Ответы (1)


Вы можете использовать ключевое слово exit в Powershell. Вот пример

Создайте сценарий sqlcmdexit.ps1 примерно со следующим:

$result = sqlcmd -S"missing" -d master -Q "select @@servername"
if ($result[1] -like "*Error Locating Server/Instance Specified*" -or $result[1] -like "*Could not open a connection to SQL Server*") {
    exit 99
}

Вызовите скрипт и посмотрите на существующий код:

C:\Users\Public\bin>.\sqlcmdExit.ps1
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : A network-related or instance-specific error has occurred while
 establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and i
f SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : Login timeout expired.

C:\Users\Public\bin>$LASTEXITCODE
99

Я не знаю, как установить ExitCode по умолчанию. Используя start-process, вы могли бы сделать что-то подобное:

$tempFile = [io.path]::GetTempFileName()
$exitCode = (Start-Process -FilePath "sqlcmd.exe" -ArgumentList @"
-S"missing" -d master -Q "select @@servername"
"@ -Wait -NoNewWindow -RedirectStandardOutput $tempFile -Passthru).ExitCode

if ($exitCode -eq 1) {
    $result = get-content $tempfile
    if ($result[1] -like "*Error Locating Server/Instance Specified*" -or $result[1] -like "*Could not open a connection to SQL Server*") {
        remove-item $tempFile
        Exit 99
    }
}
else {
    remove-item $tempfile
    Exit $exitCode
}
person Chad Miller    schedule 25.07.2012
comment
Спасибо, это очень полезно и позволит мне различать разные типы ошибок. Однако для записи результата sqlcmd в переменную потребуется немного переписать, поскольку в настоящее время я вызываю sqlcmd с помощью Start-Process (извините, я должен был упомянуть об этом). Знаете ли вы, есть ли способ сделать то же самое с объектом процесса? Насколько мне известно, у него есть только свойства ExitCode и ExitTime. В качестве альтернативы и более вероятной возможности существует ли способ установить ExitCode по умолчанию при ошибке в T-SQL? - person user1551288; 25.07.2012
comment
Спасибо! Не уверен, что сделаю это именно так, но я думаю, ты дал мне все, что мне нужно. Ваше здоровье. - person user1551288; 26.07.2012