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

标签 sql-server powershell

我在网上查了一下,但没有找到太多。事实上,大多数信息都在 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/

相关文章:

sql-server - 如何关闭 SQL Server 中的序列间隙?

SQL Server Management Studio 需要完整的表路径

powershell - REST API失败:Invoke-WebRequest:404

azure - 以编程方式下载以前版本的 Azure 存储 Blob 内容

powershell - PowerShell:用户未登录时系统找不到文件

sql-server - SQL Azure "The database XXX is not accessible"

sql - 使用 like 和 where 模式对列进行索引?

sql-server - PostgreSQL 等同于 SQL Server GROUP BY WITH ROLLUP

powershell - 在Powershell 2.0中无法将 “PasswordNeverExpires”参数设置为true

powershell - 使用管道时 Get-Member 显示不正确的属性