jobs - 这是在sql server中删除多个作业的正确方法

标签 jobs sql-server-2012

我使用 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
哈沙

最佳答案

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

因此,此选项将使您保持灵活,但我认为您将不需要时间表,因为您可能想要清理您的系统。

关于jobs - 这是在sql server中删除多个作业的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11753881/

相关文章:

php - Laravel 作业不是异步的

java - 在处置监听器中运行作业时出现 IllegalStateException

c# - 使用 Quartz.NET 调度 Cron 作业

c - 如何在不知道其名称的情况下获取 JobObject 的句柄?

sql-server - 格式化日期为 'DD Month YYYY'

sql - 将两个表合二为一

php - 作业类不接受从 laravel 中的 Controller 发送的参数

sql - 一行中的多个记录

sql - 如何在 SQL SERVER 查询中显示零计数

sql-server - 删除匹配所有值的特定行