Obter ID do trabalho OU Nome do trabalho de dentro do trabalho em execução


12

Eu tenho um banco de dados central no qual escrevo os resultados do trabalho em todos os meus servidores. Passo 3 parâmetros via powershell em um trabalho SQL de volta a um sp no servidor central que verifica se o trabalho deve estar em execução naquele momento etc. As informações são expostas pelo SSRS para que possamos ver falhas de um trabalho / trabalhos de longa execução / e trabalhos que não foram executados, mas deveriam ter (ou se alguém mexeu com uma programação).

Para fazer isso, tenho 2 etapas de trabalho adicionadas a cada trabalho em cada servidor e gostaria de reduzir o script para apenas 1 passo adicionado a cada trabalho .. possivelmente até chamá-lo de um compartilhamento de rede.

Mas meu problema é um dos três parâmetros que passo. Preciso obter o jobid ou o nome do job em execução no job em execução para não precisar codificar o parâmetro name. Os 3 parâmetros que passo são jobid, status (sucesso / falha), errormsg. O script do PowerShell que escrevi é bem direto.

Invoque-sqlcmd -ServerInstance "MYRemoteSYSTEM" - Banco de dados remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Success / FAIL', 'BAD MESSAGE HERE'"

Isso escreve o que eu preciso na tabela. Examinei msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / mas nada disso garantirá que eu receba o ID ou o nome do trabalho de execução correto no caso de haver mais de 1 trabalhos sendo executados em o mesmo tempo.

Eu até tentei olhar para sys.sysprocesses, mas acho que, como o trabalho do agente é um script do PowerShell, ele é exibido como ".Net SqlClient Data Provider", portanto, não posso cortar o JOBID binário dos trabalhos exibidos como "SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Etapa 1) "--- isso eu aprendi na postagem de Denny cherry - obrigado denny-

Qualquer idéia de como obter o jobid em execução seria muito apreciada.

Obrigado,

Chris

Respostas:


19

Você precisará usar tokens em suas etapas de trabalho para obter seu próprio ID de trabalho. Detalhes aqui: Usando tokens nas etapas da tarefa .

No final do artigo, há um exemplo com jobid:

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

Eu estava trabalhando com os tokens anteriormente, mas os abandonei porque não consegui fazê-los funcionar corretamente com o PowerShell. Estou depurando agora. Agradecemos muito a ambos.
CleanFill 17/02/2012

1

Para que isso funcionasse, eu estava usando o invoke-sqlcmdcmdlet no powershell através do agente sql. Usando as informações que recebi acima, é isso que eu criei que funcionou:

$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

A única parte que me pegou foi que eu tive que adicionar essa linha

$varname = $var.name

porque se eu não adicionasse isso, a variável inicial $ var passaria no cabeçalho system.data.datatable com o nome da coluna do trabalho, fazendo com que a variável atrapalhasse a consulta no tempo de execução.

Espero que isso possa ajudar alguém na estrada.


0

Verifique isto:

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.