3

我们正在使用 Invoke-sqlcmd cmdlet 使用 powershell 执行 SQL 查询。

如果 SQl 服务器实例错误,则抛出异常。

虽然我已经在 try catch 中捕获了错误,但它仍然在控制台中抛出异常

“Invoke-Sqlcmd:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误”

            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 Server 实例是否可用以及它是否正在运行?

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 值设置为“停止”。如果没有帮助,请尝试添加 -AbortOnError 开关

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

使用 powershell tr​​y/catch 块来捕获任何错误 - $_ 将包含完整的错误描述

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

您也可以 ping 服务器,但尝试执行命令将同时测试服务器、测试实例并测试运行查询的数据库,并且您的 try/catch 块将在每个阶段发现任何问题。

于 2012-07-18T11:51:17.133 回答