3

Invoke-sqlcmdコマンドレットを使用して、PowerShellを使用してSQLクエリを実行しています。

SQlサーバーインスタンスが間違っていると指定された場合、例外がスローされます。

try catchでエラーをキャプチャしましたが、それでもコンソールで例外をスローします。

「Invoke-Sqlcmd:SQLServerへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました」

            try {
            $Qresult= Invoke-sqlcmd -query $SelectQuery -ServerInstance $srvInstance
            $Qresult = $Qresult| % { $_.$columnName+"`n" }
            LogWrite "$Qresult`n"
        }
        catch {
            Write-error "Error occured when executing sql $SelectQuery"
            LogWrite $Error[0]
        }

クエリを実行する前に、SQLサーバーインスタンスが使用可能で実行されているかどうかを確認するにはどうすればよいですか?

4

3 に答える 3

5
function SQL-Ping-Instance 
{
    param (
        [parameter(Mandatory = $true)][string] $ServerInstance,
        [parameter(Mandatory = $false)][int] $TimeOut = 1
    )

    $PingResult = $false

    try
    {
        $SqlCatalog = "master"
        $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
        $SqlConnection.ConnectionString = "Server = $ServerInstance; Database = $SqlCatalog; Integrated Security = True; Connection Timeout=$TimeOut"
        $SqlConnection.Open() 
        $PingResult = $SqlConnection.State -eq "Open"
    }

    catch
    {
    }

    finally
    {
        $SqlConnection.Close()
    }

    return $pingResult
}

if (SQL-Ping-Instance $srvInstance)
{
    $Qresult= Invoke-sqlcmd -query $SelectQuery -ServerInstance $srvInstance
    $Qresult = $Qresult| % { $_.$columnName+"`n" }
    LogWrite "$Qresult`n"
}
else
{
    LogWrite "Couldn't contact $srvInstance"
}
于 2012-07-18T13:45:23.880 に答える
1

非終了エラーは、try/catchではキャプチャできません。エラーを終了エラーにするには、ErrorAction値を「Stop」に設定します。それでも問題が解決しない場合は、-AbortOnErrorスイッチを追加してみてください

try
{
   Invoke-sqlcmd -query... -ErrorAction Stop
}
catch
{
   $_
}
于 2012-07-18T12:09:05.563 に答える
0

PowerShellのtry/catchブロックを使用してエラーをトラップします-$_には完全なエラーの説明が含まれます

cls
try
{
invoke-sqlcmd stuff here
}
catch
{
$_
}

サーバーにpingを実行することもできますが、コマンドを実行しようとすると、サーバーがテストされ、インスタンスがテストされ、データベースがテストされます。クエリはすべて同時に実行され、try/catchブロックは各段階で問題を検出します。

于 2012-07-18T11:51:17.133 に答える