Sql server 如何基于作业名称批量更新SQL Server代理作业重试尝试

Sql server 如何基于作业名称批量更新SQL Server代理作业重试尝试,sql-server,tsql,configuration,automation,windows-server-2012,Sql Server,Tsql,Configuration,Automation,Windows Server 2012,我对运行SQL Server比较陌生,需要一些帮助来完成我刚完成的任务 我需要更新很多SQL代理作业,但不是全部。我只需要更新名称中有特定单词的名称(如“%Test%”)。 我需要在每一项中设置两件事:重试尝试(到2次)和重试间隔(到10分钟) 因为这是一个生产服务器,所以我无法真正安装任何第三方程序或重新启动服务器,或诸如此类的事情。我只能运行查询/存储过程 服务器正在运行Windows server 2012标准6.2和Microsoft SQL server 2016 13.0.5366.

我对运行SQL Server比较陌生,需要一些帮助来完成我刚完成的任务

我需要更新很多SQL代理作业,但不是全部。我只需要更新名称中有特定单词的名称(如“%Test%”)。 我需要在每一项中设置两件事:重试尝试(到2次)和重试间隔(到10分钟)

因为这是一个生产服务器,所以我无法真正安装任何第三方程序或重新启动服务器,或诸如此类的事情。我只能运行查询/存储过程

服务器正在运行Windows server 2012标准6.2和Microsoft SQL server 2016 13.0.5366.0。我使用TSQL和SSMS

任何帮助都将不胜感激

编辑:

问题解决了。使用游标和存储过程sp_update_jobstep的组合。谢谢大家的帮助

我为此编写的代码:

USE msdb ;  

DECLARE @jobname nvarchar (max);

DECLARE cursor_asd CURSOR
FOR SELECT 
  jb.name
FROM msdb.dbo.sysjobs jb
WHERE name like '%Delta%';

OPEN cursor_asd;

FETCH NEXT FROM cursor_asd INTO
    @jobname;

WHILE @@FETCH_STATUS = 0
    BEGIN

        Print @jobname
         EXEC dbo.sp_update_jobstep  
            @job_name = @jobname,  
            @step_id = 1,  
            @retry_attempts = 2,
            @retry_interval = 5 ;  

        FETCH NEXT FROM cursor_asd INTO
            @jobname;
    END;

CLOSE cursor_asd;
DEALLOCATE cursor_asd;

如果您使用的是SQL Server 2016或更高版本,则可以使用。在做所有工作之前,要非常小心,对一些工作进行彻底的测试。

查看其文档以了解更多信息

msdb.dbo.sp\u update\u jobstep


SQL代理作业的重试尝试是在每个作业步骤中定义的。如果作业包含多个步骤,则必须确定要更新的步骤,除非您只是在所有步骤上设置相同的重试

这里基本上有两张桌子:

由于重试是在每个单独的步骤中定义的,因此您将在[sysjobsteps]中查看以下列:

  • 重试\u次尝试次数-如果步骤失败,重试次数
  • 重试\u间隔-重试尝试之间等待的时间量,以分钟为单位
下面是一个简单的查询,显示了如何连接这两个表并按作业名称进行筛选:

SELECT     [jbs].* --I'm just returning the job step columns here as an example
FROM       [msdb].[dbo].[sysjobs] [jb]
INNER JOIN [msdb].[dbo].[sysjobsteps] [jbs]
    ON [jbs].[job_id] = [jb].[job_id]
WHERE      [jb].[name] LIKE '%Test%' --Job Name Filter
           AND [jbs].[step_name] = 'JobStepName'; --Use this if needing to filter to a specific job step.
一旦返回了要更新的正确作业步骤,我们就可以轻松地将其转换为update语句:

UPDATE     [jbs]
SET        [jbs].[retry_attempts] = '2'  --retry 2 times
         , [jbs].[retry_interval] = '10' --every 10 minutes
FROM       [msdb].[dbo].[sysjobs] [jb]
INNER JOIN [msdb].[dbo].[sysjobsteps] [jbs]
    ON [jbs].[job_id] = [jb].[job_id]
WHERE      [jb].[name] LIKE '%Test%' --Job Name Filter
           AND [jbs].[step_name] = 'JobStepName'; --Use this if needing to filter to a specific job step.

什么版本的SQL Server?运行此查询以查找。挑选@@VERSION@IsaacWindows Server 2012标准6.2上的Microsoft SQL Server 2016 13.0.5366.0(X64)