powershell tr​​y-catch不捕获invoke-sqlcmd错误

时间:2018-04-19 16:14:43

标签: sql-server powershell

我有一个函数,我将服务器名称传递给,然后从该服务器中选择一些数据并将其插入到集中式服务器上的表中。服务器列表是从一个并不总是最新的集中式服务器生成的,我希望它能够继续处理并记录发生的任何错误。但是,我的try-catch块似乎没有捕获任何错误。

我看到this question并尝试过,我仍然无法捕获错误。这是我的函数的通用版本:

function Get-QueryData
{
    [CmdletBinding()]
        param 
        (
            [string] $server
        )

     $QuerySelect = "select * from dbo.Table"

    try
{
$results = Invoke-Sqlcmd -ServerInstance $server `
        -Database TheDatabase `
        -Query $QuerySelect `
        -QueryTimeout 20 `
        -OutputSqlErrors $True `
        -ConnectionTimeout 5 `
        -ErrorAction Stop
}
catch
{
    #to-do: log error
    Write Host "    An error occurred trying to get query info"
}
 #  remaining function inserts into central server, this part doesn't fail
 #  unless the first part fails
}

我得到的错误:

  

Invoke-Sqlcmd:发生了与网络相关或特定于实例的错误   同时建立与SQL Server的连接... CategoryInfo:   InvalidOperations(:) [Invoke-SqlCmd] SqlException   FullQualifiedErrorId:   SqlExecutionError,Microsoft.SqlServer.Management.Powershell.GetScriptCommand

我收到此错误的原因是服务器已经站起来,然后必须重建,但它已经添加到我们的中央管理服务器。我不能立即依赖这个被清理的所以我需要powershell来记录错误并继续移动。

$ PsVersionTable.PSVersion

的输出

少校 - 5

轻微 - 1

Build - 14409

修订版 - 1012

2 个答案:

答案 0 :(得分:1)

  • Try{}$flag=$True
  • Try{}中从get-sqlcmd
  • 中删除$ results变量
  • Catch{}$flag=$false
  • 添加检查标志的finally{}
  • Finally{}添加if(!x){y}else{z}
  • Finally{if(!x){y}else{z}}
  • 如果$flag$false写入日志并退出
  • 如果$flag$true,请执行您的工作,然后写入日志

我提供[sting]$message >> $targetFile进行简单记录。有更好的方法来记录日志,我只是将这个例子用作一个简单的例子,而不是一个建议。

function Get-QueryData 
{
[CmdletBinding()]
param(
    [string] $server
)
$QuerySelect = "select * from dbo.Table"
try
{
    $flag = $true
    Invoke-Sqlcmd -ServerInstance $server `
        -Database TheDatabase `
        -Query $QuerySelect `
        -QueryTimeout 20 `
        -OutputSqlErrors $True `
        -ConnectionTimeout 5 `
        -ErrorAction Stop
}
catch
{
    $flag = $false
    #to-do: log error with $_ which contains the error object
    Write-Host "An error occurred trying to get query info"
    $errorMessage = $_.Exception.Message
}
finaly
{
    # log errors if flag false
    if (!$flag){
        "[$(get-date)] - $errorMessage" >> `
            $(some target accessible path to a writable file)
        #Stop the function and return an exit code of 1
        Return 1            
    } else {
        #  remaining function inserts into central server
        "[$(get-date)] - Short Meaningful Success Message" >> `
            $(some target accessible path to a writable file)          
    }
}
}

答案 1 :(得分:0)

所以我是个白痴,我正在复制过时的副本。我的新版本反映了我在问题中根据链接所做的更改。