AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 13347
Accepted
CleanFill
CleanFill
Asked: 2012-02-18 09:18:59 +0800 CST2012-02-18 09:18:59 +0800 CST 2012-02-18 09:18:59 +0800 CST

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

  • 772

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

sql-server-2008 sql-server-2008-r2
  • 4 4 respostas
  • 77045 Views

4 respostas

  • Voted
  1. Best Answer
    Marian
    2012-02-18T11:41:15+08:002012-02-18T11:41:15+08:00

    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:

    SELECT * FROM msdb.dbo.sysjobs
    WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 
    
    • 22
  2. CleanFill
    2012-02-23T06:04:34+08:002012-02-23T06:04:34+08:00

    Para fazer isso funcionar, 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, 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.

    • 2
  3. Gerben Kolkman
    2014-11-26T11:45:12+08:002014-11-26T11:45:12+08:00

    Verifique isso:

    DECLARE @jobId BINARY(16)
    
    SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
    WHERE name = 'Your_Job_Name'
    
    • 2
  4. Virendra Agrawal
    2016-02-25T09:37:39+08:002016-02-25T09:37:39+08:00
    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)
    
    • -2

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve