gpt4 book ai didi

sql-server - 如何显示从 SQL Server 2008 R2 作业调用的 PowerShell 步骤中的错误?

转载 作者:行者123 更新时间:2023-12-02 10:03:11 24 4
gpt4 key购买 nike

我在网上查了一下,但没有找到太多。事实上,大多数信息都在 stackoverflow 上 - Show failure for SQL 2005 Job that executes Powershell script through CMD prompt, IF PS script fails但这是 SQL Server 2005 的情况,我希望 2008 年情况有所改善。

无论如何,如果 Powershell 脚本失败,我希望能够让 SQL Server 代理作业失败。在 SQL Server 中,我使用 powershell 步骤,如下:

write-output "this is a test error"
exit -1

我以为这会导致 SQL Server 作业出错,但它没有发生,它显示成功。是否有必要使用 cmdexec 步骤,然后 shell 到 powershell,以便能够在发生错误时获取错误?

谢谢,西尔维娅

最佳答案

引用 Ed Wilson 的第 10 条技巧“10. 处理 SQL Server 代理作业中的 Windows Powershell 错误”(来自“10 Tips for the SQL Server PowerShell Scripter”):

10。处理 SQL Server 代理作业中的 Windows Powershell 错误

默认情况下,ErrorActionPreference 设置为“Continue”,这会影响错误如何冒泡到 SQL Server 作业服务器。如果将 Windows PowerShell 命令作为 SQL Server 代理作业运行并且尚不存在语法错误,则该命令会产生错误(例如,尝试从不可用的服务器获取操作系统信息)。 SQL Server 代理作业将报告成功。如果您希望错误条件停止 SQL Server 代理作业的执行或产生错误,则需要添加一些错误处理。您可以使用 Windows PowerShell 作业步骤设置 SQL Server 代理作业,如下所示:

get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'

PS return error from SqlServerAgent job

该作业将成功运行,但如果您直接在 Windows PowerShell 中运行它,您将看到:

get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'
get-wmiobject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

At line:1 char:1

+ get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'

要将 Windows PowerShell 错误冒泡到 SQL Server 代理,您需要执行以下操作之一:

A.设置 $ErrorActionPreference = "Stop"

  $erroractionpreference = "Stop"
get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'

B.在 cmdlet 级别设置 ErrorAction(更精细)

   get-wmiobject Win32_OperatingSystem -ComputerName 'nothere'  -ErrorAction 'Stop'

C.将 Try/Catch 与 ErrorActionPreference 或 ErrorAction 结合使用

try 
{
get-wmiobject Win32_OperatingSystem -ComputerName 'nothere' -ErrorAction 'Stop'

}
catch
{
throw "Something went wrong"
#or rethrow error
#throw $_
#or throw an error no message
#throw
}

D.继续,并使 SQL Server 代理作业失败

假设您有一组计算机,并且您希望继续处理错误,但您也希望作业失败。在这种情况下,您可以使用 ErrorVariable:

  #Note the -ErrorVariable parameter takes a variable name without the $ prefix.
get-wmiobject Win32_OperatingSystem -ComputerName 'localhost','nothere','Win7boot' -ErrorVariable myError

if ($myError)
{ throw ("$myError") }

关于sql-server - 如何显示从 SQL Server 2008 R2 作业调用的 PowerShell 步骤中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com