Этот старый вопрос заслуживает более полного ответа. Некоторые из них упоминаются здесь в других ответах / комментариях, другие могут или не могут работать для конкретной ситуации OP, но могут работать для других, ищущих асинхронный вызов хранимых процедур из SQL.
Просто чтобы быть абсолютно четко: TSQL делает не (само по себе) имеют возможность запускать другие операции Tsql асинхронно .
Это не значит, что у вас еще не так много вариантов:
- Задания агента SQL : создайте несколько заданий SQL и либо запланируйте их выполнение в нужное время, либо запустите их асинхронно из хранимого процесса «главный элемент управления», используя
sp_start_job
. Если вам нужно контролировать их прогресс программно, просто убедитесь, что каждое из заданий обновляет пользовательскую таблицу JOB_PROGRESS (или вы можете проверить, закончили ли они еще, используя недокументированную функцию, xp_sqlagent_enum_jobs
как описано в этой замечательной статье Грегори А. Ларсена). Вам нужно создать столько отдельных заданий, сколько вы хотите, чтобы выполнялись параллельные процессы, даже если они запускают один и тот же хранимый процесс с разными параметрами.
- Пакет служб SSIS . Для более сложных асинхронных сценариев создайте пакет служб SSIS с простым потоком задач ветвления. Службы SSIS будут запускать эти задачи в отдельных спидах, которые SQL будет выполнять параллельно. Вызовите пакет служб SSIS из задания агента SQL.
- Пользовательское приложение : создайте простое пользовательское приложение на языке по вашему выбору (C #, Powershell и т. Д.), Используя асинхронные методы, предоставляемые этим языком. Вызовите хранимую процедуру SQL в каждом потоке приложения.
- Автоматизация OLE : В SQL используйте
sp_oacreate
и sp_oamethod
для запуска нового процесса, вызывающего друг друга хранимым процессом, как описано в этой статье , также Грегори А. Ларсен.
- Компонент Service Broker . Рассмотрим использование компонента Service Broker , который является хорошим примером асинхронного выполнения в этой статье .
- CLR Параллельное выполнение : С помощью команды CLR
Parallel_AddSql
и , Parallel_Execute
как описано в этой статье Алан Каплан (SQL2005 + только).
- Запланированные задачи Windows : перечислены для полноты, но я не фанат этой опции.
Если бы это был я, я бы, вероятно, использовал несколько заданий агента SQL в более простых сценариях и пакет служб SSIS в более сложных сценариях.
В вашем случае вызов заданий агента SQL звучит как простой и управляемый выбор.
Последний комментарий : SQL уже пытается распараллеливать отдельные операции, когда это возможно *. Это означает, что выполнение 2 задач одновременно, а не после друг друга, не гарантирует, что оно завершится раньше. Проверьте внимательно, чтобы увидеть, действительно ли это что-то улучшает или нет.
У нас был разработчик, который создал пакет DTS для одновременного запуска 8 задач. К сожалению, это был только 4-х процессорный сервер :)
* Предполагая настройки по умолчанию. Это можно изменить, изменив максимальную степень параллелизма или маску сходства на сервере, или воспользовавшись подсказкой запроса MAXDOP.