我使用 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/