2012-02-02 5 views
7

He estado buscando en línea, pero no he encontrado mucho. De hecho, la mayor información ha estado aquí en stackoverflow - Show failure for SQL 2005 Job that executes Powershell script through CMD prompt, IF PS script fails, pero eso es con SQL Server 2005, espero que las cosas hayan mejorado en 2008.¿Cómo se muestra el error en el paso de PowerShell llamado desde el trabajo de SQL Server 2008 R2?

De todos modos, quiero poder tener el Agente SQL Server trabajo FAIL si falla la secuencia de comandos de Powershell. En SQL Server que estoy usando una etapa de PowerShell, con sólo esto:

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

pensé que esto haría que el trabajo de SQL Server al error, pero que no está sucediendo, que muestra el éxito. ¿Es necesario usar un paso de cmdexec y luego enviarlo a PowerShell para poder obtener errores cuando ocurren?

gracias, Sylvia

Respuesta

2

que añadir una línea en Write-Error con ErrorAction establecido para detener si quiero un paso de trabajo Powershell para devolver un error. Es solo una línea.

Write-Error "Job Failure" -EA Stop

+0

Gracias Bruce: ¡esto funcionó! – Sylvia

+0

y cómo verificar el error y devolver el error solo en caso de error? –

1

También he tenido éxito en la terminación de un paso de trabajo SQL utilizando el siguiente código:

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

Esto se utiliza para comprobar si hay archivos en un directorio de archivos ($), y luego lanzar un error si está vacío. Devolverá el THROW personalizado y devolverá el código de salida de PowerShell (mediante% errorlevel%), haciendo que su trabajo devuelva un error a la sesión del Agente SQL que ejecuta el trabajo y finalice el trabajo en ese paso.

9

Citando 10 de la punta de Ed Wilson "10. controlar los errores de Windows PowerShell en los trabajos del Agente SQL Server" de "10 Tips for the SQL Server PowerShell Scripter":

10. controlar los errores de Windows PowerShell en los trabajos del Agente SQL Server

Por defecto ErrorActionPreference se establece en Continuar, y esto tiene implicaciones sobre cómo los errores suben al Servidor de tareas de SQL Server. Si ejecuta un comando de Windows PowerShell como trabajo del Agente de SQL Server y todavía no hay errores de sintaxis, el comando produce un error (por ejemplo, intentar obtener información del sistema operativo de un servidor no disponible). El trabajo del Agente SQL Server informará el éxito. Si desea una condición de error para detener la ejecución de un trabajo del Agente SQL Server o para producir un error, deberá agregar algún tipo de manejo de error. Puede configurar un trabajo del Agente SQL Server con Windows PowerShell paso de trabajo de la siguiente manera:

get-wmiobject Win32_OperatingSystem -ComputerName 'nothere' 

PS return error from SqlServerAgent job

se ejecutará el trabajo con éxito, pero si se ejecuta directamente en Windows PowerShell, podrás ver:

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' 

burbujear errores de Windows PowerShell para el Agente SQL Server, tendrá que hacer una de las siguientes:

A. Fija tu ErrorActionPreference $ = "Stop"

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

B.Establecer ErrorAction a nivel de cmdlet (más granular)

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

C. Uso try/catch con ErrorActionPreference o 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. continuar, y falle el trabajo del Agente SQL Server

Digamos que tiene una colección de computadoras y desea continuar con el error, pero también quiere dejar el trabajo. En este caso, puede hacer uso de 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") } 
Cuestiones relacionadas