Estoy haciendo trabajos en cola y al final de cada trabajo quiero activar un SP que procesará mucho los datos. Así que no quiero esperar para completar el SP y solo quiero pasar al siguiente trabajo inmediatamente después de activar el SP. El procedimiento almacenado tomará una entrada del código de activación.Fire and Forget Sql Server Stored Procedure from C#
Problema: -
Este es mi script para crear trabajo. Tenga en cuenta que no le he agregado ningún horario.
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 @[email protected], @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:
Ahora cuando comienzo este trabajo mediante la ejecución de EXEC msdb.dbo.job_JobName'
, que es no ejecutar dbo.SpToExecute
. Necesito ejecutar dbo.SpToExecute
solo una vez dentro del trabajo y luego el trabajo debe detenerse. De nuevo, cuando ejecuto EXEC msdb.dbo.job_JobName'
, nuevamente debería ejecutar exec dbo.SpToExecute
solo una vez. ¿Puedes decirme cómo lograr esto o lo que me falta aquí?
Tome un vistazo a [SqlCommand.BeginExecuteNonQuery] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.beginexecutenonquery.aspx) [SqlCommand.BeginExecuteReader] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.beginexecutereader.aspx) [SqlCommand.BeginExecuteXmlReader] (http://msdn.microsoft.com/en-us /library/system.data.sqlclient.sqlcommand.beginexecutexmlreader.aspx) –
Necesita ejecutarlo en un hilo diferente – nemke
Algún otro subproceso tendrá que esperar el resultado ¿no? Eso no es fuego y olvídate, supongo. Como tengo muchos trabajos en cola, la mayoría de los hilos estarán en uso en algunos de esos trabajos, así que quiero liberar este hilo de acabado rápidamente, después de asignar SQL Server (que reside en otro recuadro) es tarea, hacerlo disponible para uno de los trabajos en la cola. – IsmailS