2

T-SQL スクリプトを実行するために、PowerShell から sqlcmd を呼び出しています。現在、「:On Error exit」を使用して、使用されているデータが制約に違反していることが原因でエラーが発生した場合にスクリプトを終了します。これは、1 の $SqlcmdProcess.ExitCode を検出する PowerShell によって処理されます。

ただし、データベースに接続の問題がある場合、sqlcmd は ExitCode も 1 にします。:On Error ExitCode を 1 以外に設定する方法はありますか? これを行うために :Exit(SELECT 2) のようなものを使用することは知っていますが、スクリプトを書き直す必要がないように :On Error を引き続き使用したいと思います。

4

1 に答える 1

0

Powershellでexitキーワードを使用できます。これが例です

次のような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
}
于 2012-07-25T15:15:38.843 に答える