Хранимая и забытая серверная процедура Sql из C # - PullRequest
7 голосов
/ 15 марта 2011

Я выполняю задания в очереди, и в конце каждого задания я хочу запустить 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 ]

10 голосов
/ 15 марта 2011

Вы можете использовать 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, чтобы посмотреть в этой таблице и посмотреть, какие параметры использовать.Это довольно просто.

Вот и все.Огонь и забудь.

0 голосов
/ 25 января 2013

Что вам нужно, это ИСПОЛЬЗОВАНИЕ АСИНХРОННОЙ ПРОЦЕДУРЫ . Это решение основано на компоненте Service Broker ( ссылка 1 , ссылка 2 , ссылка 3 ).

Почему это решение лучше?

Ремус говорит: 10 августа 2009 года в 10:06 я не люблю SQL Agent в эти сценарии по 3 причинам:

- у него нет возможностей самообслуживания для балансировки нагрузки. Активация брокера.

- сложно сделать непротиворечивую резервную копию из-за раздачи метаданных в пользовательской базе данных и базе данных msdb.

- Недоступно в версиях Express.

0 голосов
/ 15 марта 2011

Похоже, что вы хотите справиться со всем этим с помощью SQL Server T-SQL, а не с помощью кода .NET.

Если это так, вы можете изучить эту реализацию

...