如何根据作业名称批量更新 SQL 服务器代理作业重试次数
How to mass update SQL Server Agent Job retry attempts based on Job name
我对 运行ning SQL 服务器比较陌生,需要一些帮助来完成我刚刚完成的任务。
我需要更新很多 SQL 代理工作,但不是全部。我只需要更新名称中有特定单词的那些(例如“%Test%”)。
我需要在每个中设置 2 件事:重试次数(2 次)和重试间隔(10 分钟)。
因为这是一个生产服务器,我真的不能安装任何第三方程序或重新启动服务器,或类似的东西。我只能运行queries/stored程序。
服务器是 运行ning Windows Server 2012 Standard 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 或更高版本,您可以使用 sp_update_jobstep。在完成所有工作之前要非常小心并彻底测试一些工作。
查看其文档
msdb.dbo.sp_update_jobstep
SQL 代理作业的重试尝试是在每个单独的作业步骤中定义的。如果您的作业包含多个步骤,则必须确定要更新哪个步骤,除非您只是对所有步骤设置相同的重试。
这里基本上有两张桌子:
由于重试是在每个单独的步骤中定义的,因此您将查看 [sysjobsteps] 中的以下列:
- retry_attempts - Number of retry attempts made if the step fails.
- retry_interval - Amount of time, in minutes, to wait between retry attempts.
这是一个简单的查询,显示了如何连接这两个表并按作业名称进行过滤:
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 [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.
我对 运行ning SQL 服务器比较陌生,需要一些帮助来完成我刚刚完成的任务。
我需要更新很多 SQL 代理工作,但不是全部。我只需要更新名称中有特定单词的那些(例如“%Test%”)。 我需要在每个中设置 2 件事:重试次数(2 次)和重试间隔(10 分钟)。
因为这是一个生产服务器,我真的不能安装任何第三方程序或重新启动服务器,或类似的东西。我只能运行queries/stored程序。
服务器是 运行ning Windows Server 2012 Standard 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 或更高版本,您可以使用 sp_update_jobstep。在完成所有工作之前要非常小心并彻底测试一些工作。
查看其文档
msdb.dbo.sp_update_jobstep
SQL 代理作业的重试尝试是在每个单独的作业步骤中定义的。如果您的作业包含多个步骤,则必须确定要更新哪个步骤,除非您只是对所有步骤设置相同的重试。
这里基本上有两张桌子:
由于重试是在每个单独的步骤中定义的,因此您将查看 [sysjobsteps] 中的以下列:
- retry_attempts - Number of retry attempts made if the step fails.
- retry_interval - Amount of time, in minutes, to wait between retry attempts.
这是一个简单的查询,显示了如何连接这两个表并按作业名称进行过滤:
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 [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.