Eu tenho um banco de dados central para o qual escrevo os resultados do trabalho em todos os meus servidores. Eu passo 3 parâmetros via powershell em um trabalho SQL de volta para um sp no servidor central que verifica se o trabalho deve estar em execução naquele momento, etc. As informações são então expostas via SSRS para que possamos ver falhas de trabalho / trabalhos de longa duração / & jobs que não foram executados, mas deveriam ser executados (ou se alguém mexeu com um cronograma).
Para fazer isso, tenho 2 etapas de trabalho adicionadas a cada trabalho em cada servidor e gostaria de reduzir o script para apenas 1 etapa adicionada a cada trabalho.. possivelmente até chamá-lo de um compartilhamento de rede.
Mas meu problema é um dos 3 parâmetros que passo. Eu preciso obter o jobid em execução ou o nome do job de dentro do job em execução para não precisar codificar o parâmetro name. Os 3 parâmetros que eu passo são jobid, status(success/fail), errormsg. O script powershell que escrevi é bastante simples.
Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME/ID','Success/FAIL','BAD MESSAGE HERE'"
Isso escreve o que eu preciso para a tabela. Eu olhei msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / mas nenhum deles garantirá que eu obtenha o ID ou o nome do trabalho em execução correto no caso de haver mais de 1 trabalho em execução em o mesmo tempo.
Eu até tentei olhar para sys.sysprocesses, mas acho que, como o trabalho do agente é um script powershell, ele mostra como ".Net SqlClient Data Provider", então não posso cortar o JOBID binário dos trabalhos que mostram como "SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Step 1)" --- isso eu aprendi com o post de Denny cherry - obrigado denny-
Quaisquer idéias sobre como pegar o jobid em execução seriam muito apreciadas.
Obrigado,
Chris
Você terá que usar tokens em suas etapas de trabalho para obter seu próprio ID de trabalho. Detalhes aqui: Usando tokens em etapas de trabalho .
No final do artigo há um exemplo com jobid:
Para fazer isso funcionar, eu estava usando o
invoke-sqlcmd
cmdlet no powershell através do agente sql. Usando as informações que recebi acima, isso que eu criei que funcionou:A única parte que me pegou foi que eu tive que adicionar essa linha
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, então estava fazendo com que a variável atrapalhasse a consulta em tempo de execução.
Espero que isso possa ajudar alguém no caminho.
Verifique isso: