6

我使用的是 SQL Server 2012,我有一个必须删除 sql 作业的情况。我发现了两种方法,如下所示:

方法一

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

方法二

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

这两种方法都会删除作业,但我想知道哪种方法最好,或者您可以建议我更有效或更正确的方法来删除作业。

还有一个问题是,我们是否必须在删除之前停止/禁用该作业。

TIA哈沙

4

1 回答 1

3

我会使用方法 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

我不确定你是否担心留下来的时间表。根据@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.

所以这个选项会让你保持灵活,但我认为你不需要时间表,因为你可能想清理你的系统。

于 2012-08-01T06:54:50.740 回答