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
fonte
Para que isso funcionasse, 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, fazendo com que a variável atrapalhasse a consulta no tempo de execução.
Espero que isso possa ajudar alguém na estrada.
fonte
Verifique isto:
fonte
fonte