8

キューに入れられたジョブを実行していて、各ジョブの最後に、データに対して多くの処理を実行するSPを起動したいと思います。そのため、SPの完了を待ちたくないので、SPをトリガーした直後に次のジョブに移動したいと思います。ストアドプロシージャは、トリガーコードから入力を受け取ります。

問題:-
これは、ジョブを作成するための私のスクリプトです。スケジュールを追加していないことに注意してください。

BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'job_JobName', 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N'No description available.', 
        @category_name=N'[Uncategorized (Local)]', 
        @owner_login_name=N'UserName', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'StepName', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=1, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'TSQL', 
        @command=N'exec dbo.SpToExecute', 
        @database_name=N'DataBaseName', 
        @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

を実行してこのジョブを開始すると、実行されEXEC msdb.dbo.job_JobName'ていませんdbo.SpToExecute。ジョブ内で1回だけ実行する必要がありdbo.SpToExecute、その後ジョブが停止します。もう一度実行するEXEC msdb.dbo.job_JobName'と、もう一度実行する必要がありexec dbo.SpToExecuteます。これを達成する方法や、ここで欠けていることを教えてください。

4

2 に答える 2

12

BeginExecuteNonQueryまたはその他の非同期メソッドを使用するか、SPを実行するSQLジョブを作成してから、通常の同期ExecuteNonQueryを呼び出してジョブを実行することができます。仕事を始めるのが早いので、すぐに戻ります。その後、ジョブが実行され、それを「忘れる」ことができます。

SQLエージェントジョブアプローチのファイアアンドフォーゲットコードを次に示します。

string sql = "EXEC dbo.sp_start_job 'THE NAME OF YOUR JOB'";

そして、それをデータベースで実行します。すぐに戻るはずです。成功した場合は0を返し、失敗した場合は1を返します。ここを参照してください。

パラメータをジョブに渡すことはできません。したがって、必要に応じて、渡すパラメーターを保持するテーブルを作成できます。次に、sp_start_job SPを呼び出す前に、SPで使用するパラメーターでテーブルを更新する必要があります。次に、SPがそのテーブルを調べて、使用するパラメーターを確認する必要もあります。とても簡単です。

それについてです。ファイアアンドフォーゲット。

于 2011-03-15T06:50:08.353 に答える
0

.NET コードではなく、SQL Server T-SQL でこれらすべてを処理しようとしているようです。

もしそうなら、あなたはこの実装を研究するかもしれません

于 2011-03-15T06:57:27.233 に答える