2

我需要禁用服务器上运行的所有作业。我运行了以下代码:

   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 (没有帮助),或者重新启动服务器。

我可以重新启动服务器,但我很好奇是否有其他人看到过这种行为,知道原因,知道如何以另一种方式修复它。

4

1 回答 1

1

你为什么要为日程安排烦恼?使用带有动态 SQL 的sp_update_job来禁用所有作业:

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

于 2016-10-09T12:18:50.047 回答