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

时间:2012-02-02 11:44:25

标签: 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 to powershell,以便能够在出现错误时获取错误?

感谢, 西尔维亚

4 个答案:

答案 0 :(得分:12)

引用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代理,您需要执行以下操作之一:

:一种。设置$ ErrorActionPreference =&#34;停止&#34;

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

<强> B中。在cmdlet级别设置ErrorAction(更细粒度)

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

<强>℃。将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") }

答案 1 :(得分:3)

如果我想要Powershell作业步骤返回错误,我在Write-Error中添加一行,并将ErrorAction设置为停止。这只是一条线。

Write-Error "Job Failure" -EA Stop

答案 2 :(得分:1)

我还通过使用以下代码成功终止了SQL作业步骤:

    if (!$files) 
    {THROW 'Throw Error: the backup directory was empty!'; "%errorlevel%"} 

这用于检查目录中是否有文件($ files),如果为空则抛出错误。它将返回自定义THROW并返回PowerShell退出代码(通过%errorlevel%),导致您的作业将错误返回到运行作业的SQL代理会话并在该步骤结束作业。

答案 3 :(得分:0)

如果您使用的是“ CmdExec”步骤而不是“ PowerShell”步骤(应使用due to PowerShell versioning reasons),则以下语法对我有用:

powershell.exe -command "try { & 'D:\BadScript.ps1'} catch { throw $_ }"

(来自Joel Greijer)。