Har*_*sha 5 jobs sql-server-2012
我正在使用SQL Server 2012,但我不得不删除sql作业。我发现了以下两种方法:
方法1
DECLARE @jobId binary(16)
WHILE (1=1)
BEGIN
SET @jobId = NULL
SELECT TOP 1 @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name like N'Abc%')
IF @@ROWCOUNT = 0
BREAK
IF (@jobId IS NOT NULL)
BEGIN
EXEC msdb.dbo.sp_delete_job @jobId
END
END
Run Code Online (Sandbox Code Playgroud)
方法2
DECLARE @listStr VARCHAR(MAX)=null
SELECT @listStr = COALESCE(@listStr+'exec msdb.dbo.sp_delete_job ' ,'') + '''' + convert(varchar(max),job_id) + '''; '
FROM msdb.dbo.sysjobs WHERE (name like N'$(TestPublisherServer)-$(TestPublisherDB)%')
IF @listStr is not null
BEGIN
PRINT 'exec msdb.dbo.sp_delete_job ' + @listStr
EXEC ('exec msdb.dbo.sp_delete_job ' + @listStr)
END
Run Code Online (Sandbox Code Playgroud)
两种方法都将删除作业,但是我想知道哪种方法最好,或者您可以建议我更有效或更正确的方式删除作业。
还有一个问题是,在删除作业之前,我们是否必须停止/禁用该作业。
TIA哈莎
我会使用方法 1,因为它既简单又有效。之前无需禁用该作业。如果您在作业运行时将其删除,该作业将因错误而终止,因此请检查这是否是您的要求。
处理这个问题的方法(由OP发布):
IF exists(
select 1 from msdb.dbo.sysjobactivity activity
where activity.run_Requested_date is not null
and activity.stop_execution_date is null
and activity.job_id = @jobId)
exec msdb.dbo.sp_stop_job @job_id = @jobId
Run Code Online (Sandbox Code Playgroud)
不知道您是否担心住宿的日程安排。根据@delete_unused_schedule
设置方式,sp_delete_job
默认将其删除。
查看存储过程注释
@delete_unused_schedule BIT = 1 -- For backward compatibility schedules are deleted by default if they are not
-- being used by another job. With the introduction of reusable schedules in V9
-- callers should set this to 0 so the schedule will be preserved for reuse.
Run Code Online (Sandbox Code Playgroud)
因此,此选项将使您保持灵活性,但我认为您不需要时间表,因为您可能想要清理系统。