Obtener el ID del trabajo O el nombre del trabajo desde el trabajo en ejecución


12

Tengo una base de datos central en la que escribo los resultados del trabajo en todos mis servidores. Paso 3 parámetros a través de powershell en un trabajo SQL de nuevo a un sp en el servidor central que verifica que el trabajo se esté ejecutando en ese momento, etc. La información se expone luego a través de SSRS para que podamos ver fallas en un trabajo / trabajos de larga ejecución / & trabajos que no se han ejecutado pero que deberían haberse ejecutado (o si alguien se metió con un horario).

Para hacer esto, tengo 2 pasos de trabajo agregados en cada trabajo en cada servidor y me gustaría reducir el script a solo 1 paso agregado a cada trabajo ... posiblemente incluso llamarlo desde un recurso compartido de red ...

Pero mi problema es uno de los 3 parámetros que paso. Necesito obtener el nombre de trabajo o el nombre del trabajo de ejecución dentro del trabajo de ejecución para no tener que codificar el parámetro de nombre. Los 3 parámetros que paso son jobid, estado (éxito / falla), errormsg. El script de PowerShell que escribí es bastante sencillo.

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Success / FAIL', 'BAD MESSAGE HERE'"

Esto escribe lo que necesito en la mesa. He mirado msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / pero ninguno de estos garantizará que obtenga el ID o el nombre del trabajo de ejecución correcto en caso de que haya más de 1 trabajos ejecutándose en al mismo tiempo.

Incluso he intentado ver los procesos sys.sys pero creo que, dado que el trabajo del agente es un script de PowerShell, se muestra como ".Net SqlClient Data Provider", por lo que no puedo recortar el JOBID binario de los trabajos que se muestran como "SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Paso 1) "--- esto lo aprendí de la publicación de Denny cherry - gracias denny-

Cualquier idea sobre cómo tomar el jobid ejecutor sería muy apreciada.

Gracias,

Chris

Respuestas:


19

Tendrá que usar tokens en los pasos de su trabajo para obtener su propia identificación de trabajo. Detalles aquí: Uso de tokens en pasos de trabajo .

Al final del artículo hay un ejemplo con jobid:

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 

Estaba trabajando con los tokens antes, pero los abandoné porque no pude hacer que funcionen correctamente con powershell. Estoy depurando ahora. Muchas gracias a ambos.
CleanFill

1

Para que esto funcione, estaba usando el invoke-sqlcmdcmdlet en powershell a través del agente sql. Usando la información que recibí arriba, esto con lo que se me ocurrió funcionó:

$var = Invoke-sqlcmd -Server "Server\Instance" -Query "select name from msdb.dbo.sysjobs WHERE job_id = CONVERT(uniqueidentifier, $(ESCAPE_SQUOTE(JOBID)))" -- This gives me the job name at runtime

$varname = $var.name -- here i have to put just the name into a variable

Invoke-sqlcmd -Server "server\instance" -Database "remote database" -Query "exec dbo.JOB_LOG $varname,'JOB STATUS HERE','LOG MESSAGE HERE';" 
--here I pass that to the remote system

La única parte que me atrapó fue que tuve que agregar esta línea

$varname = $var.name

porque si no agrego esto, la variable inicial $ var pasaría en el encabezado system.data.datatable largo con el nombre de la columna del trabajo, por lo que estaba causando que la variable estropeara la consulta en tiempo de ejecución.

Espero que esto pueda ayudar a alguien más en el camino.


0

Mira esto:

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'

-2
DECLARE @jobname sysname, @jobid uniqueidentifier

SELECT @jobname=b.name,@jobid=b.job_id  
FROM sys.dm_exec_sessions a,msdb.dbo.sysjobs b
WHERE a.session_id=@@spid
AND 
(SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(a.PROGRAM_NAME,30,10)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.