6

SQL Server 2012を使用していますが、SQLジョブを削除する必要がある場合があります。私は次の2つのアプローチを見つけました:

アプローチ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

どちらの方法でもジョブが削除されますが、どちらが最善の方法であるかを知りたいので、ジョブを削除するためのより効率的または正しい方法を提案してください。

そしてもう1つの質問は、ジョブを削除する前にジョブを停止/無効にする必要があるかどうかです。

TIAハーシャ

4

1 に答える 1

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.

したがって、このオプションは柔軟なままですが、おそらくシステムをクリーンアップしたいので、スケジュールは必要ないと思います。

于 2012-08-01T06:54:50.740 に答える