私sp_start_job
は仕事を始めるために使用します。
ジョブ(test2
)には1つのステップしかありません。
select getdate()
waitfor delay '00:00:10'
TRY/CATCH
コード:
begin try
EXEC msdb.dbo.sp_start_job @job_name = 'test2'
end try
begin catch
print 'error'
end catch
コードの最初の実行:
ジョブ「test2」が正常に開始されました。
コードの2回目の実行(10秒以内):
メッセージ22022、レベル16、状態1、行0
SQLServerAgentエラー:ユーザーsaによる要求からジョブが既に実行されているため、(ユーザーsaからの)ジョブtest2の実行要求が拒否されました。
TRY/CATCH
このシナリオで機能しないのはなぜですか?
更新:最初に、サーバーがリンクされているSQL Server 2005(SQL Server 2000)で作業していることを追加する必要があります。リンクされたすべてのサーバーでジョブを確認するために、SQLServer2005サーバーでプロシージャを作成しようとしました。ジョブが実行されていない場合は、実行します。最初は、try --catchを使用し、すでに実行中のジョブを実行したときにエラーをキャッチしたいと思っていましたが、失敗しました(このスレッド)。
私はついに次のコードを使用しました:(コンパイルされません、いくつかの変数を置き換える必要があります、ただアイデアを与えるだけです)
CREATE TABLE [dbo].[#jobInfo](
[job_id] [uniqueidentifier] NULL,
[originating_server] [nvarchar](30) ,
[name] [nvarchar](128) ,
[enabled] [tinyint] NULL,
[description] [nvarchar](512) ,
[start_step_id] [int] NULL,
[category] [nvarchar](128) ,
[owner] [nvarchar](128) ,
[notify_level_eventlog] [int] NULL,
[notify_level_email] [int] NULL,
[notify_level_netsend] [int] NULL,
[notify_level_page] [int] NULL,
[notify_email_operator] [nvarchar](128) ,
[notify_netsend_operator] [nvarchar](128) ,
[notify_page_operator] [nvarchar](128) ,
[delete_level] [int] NULL,
[date_created] [datetime] NULL,
[date_modified] [datetime] NULL,
[version_number] [int] NULL,
[last_run_date] [int] NOT NULL,
[last_run_time] [int] NOT NULL,
[last_run_outcome] [int] NOT NULL,
[next_run_date] [int] NOT NULL,
[next_run_time] [int] NOT NULL,
[next_run_schedule_id] [int] NOT NULL,
[current_execution_status] [int] NOT NULL,
[current_execution_step] [nvarchar](128) ,
[current_retry_attempt] [int] NOT NULL,
[has_step] [int] NULL,
[has_schedule] [int] NULL,
[has_target] [int] NULL,
[type] [int] NOT NULL
)
SET @sql =
'INSERT INTO #jobInfo
SELECT * FROM OPENQUERY( [' + @srvName + '],''set fmtonly off exec msdb.dbo.sp_help_job'')'
EXEC(@sql)
IF EXISTS (select * from #jobInfo WHERE [name] = @jobName AND current_execution_status IN (4,5)) -- 4: idle, 5: suspended
BEGIN
SET @sql = 'EXEC [' + @srvName + '].msdb.dbo.sp_start_job @job_name = ''' + @jobName + ''''
--print @sql
EXEC (@sql)
INSERT INTO #result (srvName ,status ) VALUES (@srvName, 'Job started.')
END ELSE BEGIN
INSERT INTO #result (srvName ,status ) VALUES (@srvName, 'Job is running already. No action taken.')
END