2010-06-18 98 views
3

我正在尝试创建一个用于处理SQL Server代理作业的相当简单的脚本。它执行两个任务:错误14274 - 无法删除然后重新添加作业

1)如果给定的任务中存在,删除它 2)创建工作

(由于业务需求,我不能修改现有作业,脚本必须删除&重创建它。)

第一次运行脚本正常工作(创建作业)。之后的任何时间运行都会产生错误14274“无法添加,更新或删除源自MSX服务器的作业。”

我已经在这方面做了大量的搜索,并且大多数解决方案围绕着正在改变的服务器名称。我的服务器名称没有改变,也没有改变过。

这是我有:

USE [msdb]; 

SET NOCOUNT ON; 

DECLARE @JobName NVARCHAR(128); 
DECLARE @ReturnCode INT; 
declare @errCode INT; 

SET @JobName = 'AJob'; 

BEGIN TRANSACTION; 

DECLARE @jobId uniqueidentifier; 

SET @jobId = (SELECT job_id from msdb.dbo.sysjobs where name = @JobName); 

IF(@jobId IS NOT NULL) -- delete if it already exists 
begin 
    EXEC @ReturnCode = msdb.dbo.sp_delete_job @[email protected] 
    IF(@@ERROR <> 0 OR @ReturnCode <> 0) 
    begin 
     set @errCode = @@ERROR; 
     GOTO QuitWithRollback; 
    end 
    print 'deleted job'; 
end 


-- create the job 
EXEC @ReturnCode = msdb.dbo.sp_add_job @[email protected], 
     @enabled=1, 
     @notify_level_eventlog=0, -- on failure 
     @notify_level_email=0, 
     @notify_level_netsend=0, -- never 
     @notify_level_page=0, 
     @delete_level=0, 
     @description=NULL, 
     @owner_login_name=N'sa', 
     @notify_email_operator_name=NULL, 
     @job_id = @jobId OUTPUT 
IF(@@ERROR <> 0 OR @ReturnCode <> 0) 
begin 
    set @errCode = @@ERROR; 
    GOTO QuitWithRollback; 
end 
print 'added job'; 

-- Server 
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver 
    @job_id = @jobId 
IF(@@ERROR <> 0 OR @ReturnCode <> 0) 
    GOTO QuitWithRollback; 

COMMIT TRANSACTION; 
RETURN; 

QuitWithRollback: 
    IF(@@TRANCOUNT > 0) 
     ROLLBACK TRANSACTION; 
    print 'Err: ' + CAST(@errCode AS varchar(10)) + ' ret: ' + cast(@ReturnCode as varchar(10)); 

我运行它在SQL 2008 SP1。任何帮助将非常感谢!

回答

4

其实我在弄糊涂后想到了这个。

似乎有必要在删除和创建作业的语句之间设置@JobId变量为NULL。一旦你这样做,错误消失,它的工作。

我希望这可以帮助别人!