Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

3 maneiras de obter as etapas de trabalho de um trabalho do SQL Server Agent (T-SQL)


Neste artigo, apresento três opções para retornar as etapas de um trabalho do SQL Server Agent ao usar o T-SQL.

As opções


Você pode usar as seguintes opções de T-SQL para retornar as etapas de um trabalho do SQL Server Agent:
  • Opção 1 :Execute o sp_help_job procedimento armazenado.
  • Opção 2 :Execute o sp_help_jobstep procedimento armazenado.
  • Opção 3 :Consulte as sysjobsteps tabela (e junte-a com sysjobs_view se necessário).

Todas essas opções residem no msdb banco de dados e, portanto, precisam ser executados nesse banco de dados. Você pode fazer isso alternando para o msdb banco de dados primeiro, ou qualificando o objeto apropriadamente (por exemplo, msdb.dbo.sysjobsteps ).

Opção 1:sp_help_job


Quando você chama sp_help_job sem argumentos, ele simplesmente retorna uma lista de trabalhos. Mas quando você passa o nome ou ID de um trabalho, ele lista os detalhes desse trabalho, incluindo suas etapas.

Aqui está um exemplo:
EXEC sp_help_job 
	@job_name = 'SqlAgentTest';

Resultado:

Isso lista o trabalho, bem como todas as etapas do trabalho, agendamentos e servidores de destino.

Aqui está um exemplo do código ao usar o ID:
EXEC sp_help_job 
	@job_id = '343D9F2A-070A-4367-BF69-4248FFF57D70';

Ao usar o ID, você pode omitir o nome do parâmetro, se desejar.

Exemplo:
EXEC sp_help_job '343D9F2A-070A-4367-BF69-4248FFF57D70';

Sintaxe


A sintaxe completa de sp_help_job fica assim:
sp_help_job { [ @job_id = ] job_id  
[ @job_name = ] 'job_name' }   
     [ , [ @job_aspect = ] 'job_aspect' ]   
     [ , [ @job_type = ] 'job_type' ]   
     [ , [ @owner_login_name = ] 'login_name' ]   
     [ , [ @subsystem = ] 'subsystem' ]   
     [ , [ @category_name = ] 'category' ]   
     [ , [ @enabled = ] enabled ]   
     [ , [ @execution_status = ] status ]   
     [ , [ @date_comparator = ] 'date_comparison' ]   
     [ , [ @date_created = ] date_created ]   
     [ , [ @date_last_modified = ] date_modified ]   
     [ , [ @description = ] 'description_pattern' ]

Consulte a documentação da Microsoft para sp_help_job para uma explicação de cada parâmetro, bem como os valores que cada um aceita.

Opção 2:sp_help_jobstep


O sp_help_jobstep procedimento armazenado é projetado especificamente para retornar as etapas de um trabalho. Mas isso é tudo o que retorna.

Portanto, se você não quiser ver nenhuma programação e coisas do servidor de destino, etc., isso pode ser o que você está procurando.

Você pode passar sp_help_jobstep o nome do trabalho ou seu ID (mas não ambos).

Aqui está um exemplo:
EXEC sp_help_jobstep
	@job_name = 'SqlAgentTest';

E aqui está o resultado em um trabalho de duas etapas:

Você também pode especificar um ID de etapa se desejar que apenas uma etapa específica seja retornada. Você ainda precisa especificar para qual trabalho é (com seu ID ou nome).

Aqui está um exemplo de especificação da segunda etapa no trabalho:
EXEC sp_help_jobstep
	@job_name = 'SqlAgentTest', 
	@step_id = 2;

O ID da etapa precisa realmente existir para esse trabalho. Por exemplo, especificando um ID de etapa de 3 para o trabalho acima resulta em um erro.

Opção 3:as sysjobsteps Tabela


Outra opção é executar uma consulta em sysjobsteps tabela.

Esta tabela contém as etapas de todos os trabalhos, portanto, se você quiser apenas as etapas de um trabalho específico, precisará passar o ID do trabalho.

Aqui está um exemplo de consulta de sysjobsteps tabela para as etapas de um trabalho específico:
SELECT * FROM msdb.dbo.sysjobsteps
WHERE job_id = '8A6E1BFF-9F46-4FF9-8E63-ABC8B224B6F8';

Isso retorna um resultado semelhante ao sp_help_jobstep procedimento.

Se você quiser que alguns dos detalhes do trabalho sejam retornados (como seu nome), você pode executar uma junção entre sysjobsteps e sysjobs_view .

Exemplo:
SELECT
	jv.name,
	jv.description,
	jv.start_step_id,
	js.step_id,
	js.step_name
FROM msdb.dbo.sysjobs_view jv
LEFT JOIN msdb.dbo.sysjobsteps js
ON jv.job_id = js.job_id;

Aqui está o resultado no meu ambiente de teste:

Por ser uma junção esquerda, ela inclui trabalhos que não têm etapas (consulte o NULL no step_id e step_name colunas para o trabalho chamado TestJob ).

Para limitá-lo apenas aos trabalhos com etapas, use uma junção interna.