Для начала было бы полезно, если бы вы опубликовали свой код. Довольно часто SQL можно модифицировать для обработки нескольких значений «на основе множеств». Другими словами, если у вас есть набор значений для обработки, вы можете обрабатывать их все одновременно.
Есть много способов сделать это. Вы можете передать строку с разделителями, а затем проанализировать ее в вашем процессе. Много идей по реализации этого здесь
Вы также можете передать XML и "присоединиться" к XML в вашем процессе, используя APPLY
.
В SQL 2008+ вы можете использовать Таблица значений параметров
Поскольку я не знаю, что именно вы делаете с параметром AreaID, я не знаю, ответил ли я на ваш вопрос, поэтому здесь есть дополнительная информация.
Если вы хотите запустить хранимую процедуру асинхронно, вам лучше всего выбрать Service Broker, который позволит вам поместить параметр в очередь, и отдельные потоки будут обрабатывать очередь. SQL управляет всеми потоками упорядочения, блокировок, повторов, порождения / уничтожения и т. Д. Это очень надежная система.
Есть комментарий к вопросу от другого пользователя, который, кажется, подключен к OP относительно отслеживания прогресса. Вот мысль:
У вас есть таблица "queue", которая содержит batchid, параметр areaID и флаг состояния.
CREATE TABLE asynchQueue
(
RecNo INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
BatchID INT,
AreaID INT,
Status TINYINT
)
Приложение C # вставляет в таблицу очередей уникальный идентификатор пакета для вашего приложения и вызова (для группировки запросов)
У вас запланирован периодический запуск процесса, например:
CREATE PROC ProcessQueue
AS
BEGIN
SET XACT_ABORT ON
DECLARE @RecNo INT,
@AreaId INT
BEGIN TRAN
SELECT TOP 1 @RecNo = recNo,
@AreaID = areaId
FROM AsynchQueue WITH ROWLOCK, XLOCK
WHERE Status = 0
UPDATE AsynchQueue SET Status = 1 --Mark record as in progress
WHERE RecNo = @RecNo
COMMIT
EXEC YourProc @AreaId
UPDATE AsynchQueue SET Status = 2 -- Mark Record as complete
WHERE RecNo = @RecNo
END
Или процедура может содержать цикл для обработки всех записей в таблице. Процесс может быть запланирован или вызван по требованию, используя sp_start_job, как предложил Джон Уэлдон.
Затем вы можете запросить статус следующим образом:
SELECT COUNT(NULLIF(Status, 0))/COUNT(*) as PctComplete --in progress or complete div by total
FROM AsynchQueue WITH NOLOCK
WHERE BatchID = @yourBatchId
Этот запрос даст вам процент выполнения вашей партии.