У нас есть хранимая процедура, которую пользователи могут запускать вручную, чтобы получить обновленные номера для отчета, который постоянно используется в течение дня.
У меня есть вторая хранимая процедура, которая должна быть запущена после запуска первой хранимой процедуры, поскольку она основана на числах, полученных из этой первой хранимой процедуры, однако для ее выполнения требуется больше времени, и она предназначена для отдельного процесса, поэтому я не хочу заставьте пользователя ждать, пока эта вторая хранимая процедура будет запущена.
Есть ли способ заставить одну хранимую процедуру запустить вторую хранимую процедуру и сразу же вернуться, не дожидаясь результатов?
Я использую SQL Server 2005.
Ответы:
Похоже, что для этого есть несколько способов, но я обнаружил, что самым простым способом было предложение Мартина настроить процедуру в задании SQL и запустить ее с помощью асинхронной команды sp_start_job из моей хранимой процедуры.
Это работает только для меня, потому что мне не нужно указывать какие-либо параметры для моей хранимой процедуры.
Другие предложения, которые могут работать в зависимости от вашей ситуации:
Асинхронное выполнение процесса в коде, который отвечает за выполнение хранимой процедуры, как предложил Mr.Brownstone .
Неплохая идея, однако в моем случае хранимая процедура вызывается из нескольких мест, поэтому поиск всех этих мест и обеспечение того, чтобы они вызывали 2-ю процедуру, тоже не казался практичным. Кроме того, 2-я хранимая процедура довольно важна, и ее отсутствие может привести к серьезным проблемам для нашей компании.
источник
EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.
, так как ни компонент Service Broker, ни агент Sql не существуют в Azure. Я не знаю, почему Microsoft после полутора десятилетий опрошенных отказывается добавлятьEXECUTE ASYNC RematerializeExpensiveCacheTable
.Вы можете использовать сервис-брокер вместе с активацией в очереди. При этом вы можете разместить параметры для вызова процедуры в очереди. Это занимает примерно столько же времени, сколько и вкладыш. После фиксации транзакции и, возможно, еще нескольких секунд, активация автоматически вызывает процедуру получателя асинхронно. Для этого нужно просто взять параметры очереди и выполнить желаемую работу.
источник
Этот старый вопрос заслуживает более полного ответа. Некоторые из них упоминаются здесь в других ответах / комментариях, другие могут или не могут работать для конкретной ситуации OP, но могут работать для других, ищущих асинхронный вызов хранимых процедур из SQL.
Просто чтобы быть абсолютно четко: TSQL делает не (само по себе) имеют возможность запускать другие операции Tsql асинхронно .
Это не значит, что у вас еще не так много вариантов:
sp_start_job
. Если вам нужно контролировать их прогресс программно, просто убедитесь, что каждое из заданий обновляет пользовательскую таблицу JOB_PROGRESS (или вы можете проверить, закончили ли они еще, используя недокументированную функцию,xp_sqlagent_enum_jobs
как описано в этой замечательной статье Грегори А. Ларсена). Вам нужно создать столько отдельных заданий, сколько вы хотите, чтобы выполнялись параллельные процессы, даже если они запускают один и тот же хранимый процесс с разными параметрами.sp_oacreate
иsp_oamethod
для запуска нового процесса, вызывающего друг друга хранимым процессом, как описано в этой статье , также Грегори А. Ларсен.Parallel_AddSql
и ,Parallel_Execute
как описано в этой статье Алан Каплан (SQL2005 + только).Если бы это был я, я бы, вероятно, использовал несколько заданий агента SQL в более простых сценариях и пакет служб SSIS в более сложных сценариях.
В вашем случае вызов заданий агента SQL звучит как простой и управляемый выбор.
Последний комментарий : SQL уже пытается распараллеливать отдельные операции, когда это возможно *. Это означает, что выполнение 2 задач одновременно, а не после друг друга, не гарантирует, что оно завершится раньше. Проверьте внимательно, чтобы увидеть, действительно ли это что-то улучшает или нет.
У нас был разработчик, который создал пакет DTS для одновременного запуска 8 задач. К сожалению, это был только 4-х процессорный сервер :)
* Предполагая настройки по умолчанию. Это можно изменить, изменив максимальную степень параллелизма или маску сходства на сервере, или воспользовавшись подсказкой запроса MAXDOP.
источник
sp_start_job
, как я описал в своей первой статье (поскольку нет встроенного типа шага задания «начать другое задание»). Но я думаю, что вы правы в отношении отдельных статусов работы, не сводящихся к мастеру; вам нужно будет запросить статус неудачи / успеха индивидуально.Да, один метод:
источник
sp_start_job
для ее запуска или динамического создания заданий по мере необходимости, чтобы избежать опроса каждую минуту, но сложность для этого случая, вероятно, означает, что она будет не проще, чем брокер служб.sp_start_job
возвращается немедленно. Не могу вспомнить, какие разрешения ему нужны.Другой возможностью было бы получить первую хранимую процедуру для записи в таблицу аудита после ее завершения и поместить триггер в таблицу аудита, которая запускает вторую хранимую процедуру при записи в таблицу аудита. Не нужно постоянно опрашивать и не нужно дополнительное задание агента SQL Server.
источник
INSERT
илиUPDATE
, а не асинхронно, поэтому Мартин прав, что 1-я процедура все равно будет ждать до тех пор, пока 2-я процедура не завершится.