我需要禁用服务器上运行的所有作业。我运行了以下代码:
declare @t table (schedule_id int, [name] varchar(300))
update msdb.dbo.sysschedules
set enabled = 0
output inserted.schedule_id, inserted.name into @t
from msdb.dbo.sysjobs j
join msdb.dbo.sysjobschedules js
on j.job_id = js.job_id
join msdb.dbo.sysschedules s
on js.schedule_id = s.schedule_id
where j.[name] not like 'DB -%' and j.[name] not like 'sys%' and j.[name] not like 'Maintenance%'
select * from @t
当我通过SQL代理GUI或SQL检查给定作业及其相关计划时,我可以看到计划已禁用。但是,作业仍然在运行,如果我检查msdb.dbo.sysjobschedules,我可以在将来查看下一个运行日期。
我在网上看到的唯一的事情是,有一个后台线程需要刷新以获取此更改?这样做,我需要运行sp_sqlagent_refresh_job(没有帮助),或重新启动服务器。
我可以重新启动服务器,但我很好奇是否有其他人看过这种行为,知道原因,知道如何以另一种方式修复它。
答案 0 :(得分:1)
你为什么打扰时间表?使用sp_update_job和动态SQL禁用所有作业:
DECLARE @sql nvarchar(max)
;WITH cte AS (
SELECT j.job_id,
j.[name]
FROM msdb.dbo.sysjobs j
WHERE j.[name] not like 'DB -%'
and j.[name] not like 'sys%'
and j.[name] not like 'Maintenance%'
)
SELECT @sql = (
SELECT 'EXEC msdb.dbo.sp_update_job @job_id = '''+CAST(job_id as nvarchar(max))+''', @enabled = 0;'+CHAR(10)
FROM cte
FOR XML PATH('')
)
EXEC sp_executesql @sql
如果您在PRINT @sql
之前EXEC
,您会看到生成的查询:
EXEC msdb.dbo.sp_update_job @job_id = 'CCCF8FC0-FCD4-4260-9A48-518AF5826297', @enabled = 0;
EXEC msdb.dbo.sp_update_job @job_id = '48BB41E6-6BEC-452B-8D42-760AECDBB808', @enabled = 0;
如果您需要停止工作,请使用sp_stop_job。