2010-06-18 57 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。一旦你這樣做,錯誤消失,它的工作。

我希望這可以幫助別人!

相關問題