Хранимая и забытая серверная процедура Sql из C#
Я выполняю задания в очереди, и в конце каждого задания я хочу запустить 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
, Мне нужно бежать dbo.SpToExecute
только один раз в работе, а затем работа должна остановиться. Снова, когда я выполняю EXEC msdb.dbo.job_JobName'
это должно снова бежать exec dbo.SpToExecute
только однажды. Подскажите, пожалуйста, как этого добиться или чего мне здесь не хватает?
3 ответа
Вы можете использовать BeginExecuteNonQuery или другие асинхронные методы, или вы можете создать задание SQL, которое будет запускать ваши SP, а затем просто вызывать обычный синхронный ExecuteNonQuery для запуска задания. Он вернется немедленно, так как начать работу быстро. Затем работа запускается, и вы можете "забыть" об этом.
Вот некоторый код для запуска и работы с агентами SQL.
string sql = "EXEC dbo.sp_start_job 'THE NAME OF YOUR JOB'";
А затем просто выполните это в базе данных. Это должно вернуться немедленно. Он вернет 0, если он был успешным, и 1, если не удалось. Смотрите здесь.
Вы не можете передать параметр в работу. Поэтому, если вам нужно, вы можете создать таблицу, которая будет содержать параметры, которые вы хотите передать. Затем вам нужно будет обновить таблицу параметрами, которые вы хотите, чтобы ваш SP использовал перед вызовом sp_start_job SP. Тогда вам также понадобится ваш SP, чтобы посмотреть в этой таблице и посмотреть, какие параметры использовать. Это довольно легко.
Вот и все. Огонь и забудь.
Похоже, вы пытаетесь справиться со всем этим с помощью SQL Server T-SQL, а не с помощью кода.NET.
Если это так, вы можете изучить эту реализацию
То, что вам нужно, это асинхронная процедура исполнения. Это решение основано на компоненте Service Broker ( ссылка 1, ссылка 2, ссылка 3).
Почему это решение лучше?
Ремус говорит: 10 августа 2009 года в 10:06 утра. Мне не нравится агент SQL в этих сценариях по 3 причинам:
- у него нет возможности самостоятельной балансировки нагрузки при активации компонента Service Broker.
- трудно сделать согласованное резервное копирование из-за распределения метаданных по пользовательской базе данных и базе данных msdb.
- Это не доступно в Экспресс-выпусках.