2012-08-01 21 views
3

即時通訊使用SQL Server 2012和我有一個情況下,我必須刪除SQL作業。我發現這兩種方法如下:這是正確的方式來刪除SQL Server中的多個作業

方法1

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 

方法2

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 戒

+0

+1,好問題! – 2012-09-19 20:53:22

+0

謝謝克里斯 – Harsha 2012-11-27 06:17:02

回答

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. 

所以這個選項會保持你靈活的,但我想你不會有任何需要的時間表,因爲你可能要清理系統。

+0

但有人說,我們必須在刪除它之前停止正在運行的作業。你確定沒有必要在刪除它之前停止工作。 – Harsha 2012-08-01 11:15:08

+0

對不起,我沒有閱讀'停止'作爲停止..我剛剛測試你的方案與SQL Server 2008和作業被刪除後直接終止作業。所以這可能會導致你一個未完成的工作!無論如何,如果您意識到這一點,請檢查活動監視器是否有正在運行的作業,或者檢查計劃是否有一些事情要開始。我認爲你應該這樣做很好。 – stb 2012-08-01 11:36:07

+0

如果您想完全保存,您可以使用循環來使用'sp_update_job'禁用所有作業。 – stb 2012-08-01 11:40:41

相關問題