2011-10-31 98 views
0

作为标题,如何以并行方式执行存储过程?执行存储过程并行方式

更详细地说,我有一个在Sql Server中创建的存储过程调用Execute_Sql并传入一个参数AreaID INT作为参数。

我从.net C#调用并成功执行,一次传入一个ID,循环ID以获取New_ID。

这里我的问题,我试图做执行存储PROD的并联方式。比如当我执行ID = 1时,同时我也同时执行了ID = 2。

什么在线程中出现在我的脑海里,创建了并行的处理方式。是否有任何方法可以执行存储的prod?

+1

也许你可以编写一个新的存储过程,它需要几个'AreaID',然后在SQL服务器上一次完成所有的处理。 –

+0

@CoryLarson同意你的意见,但可能会出现我们需要显示处理进度的情况。 – Damith

回答

0

你可以调查sp_start_job

你不能把参数传递的工作不过这样你需要获得通过另一种方式的参数。

您可以设置该作业,以便它从表中读取参数,然后用您想要运行该sproc的值填充表格,然后发出一些对作业的调用。

您可能希望自己的作业通过更新位标志或行上的某些内容来标记正在处理的行,以防止作业之间重复工作。

http://msdn.microsoft.com/en-us/library/ms186757.aspx

0

对于初学者来说,如果你发布你的代码,这将是有益的。通常可以修改SQL来以“基于集合”的方式处理多个值。换句话说,如果您有一组要处理的值,则可以同时处理它们。

有很多方法可以做到这一点。你可以传入一个分隔字符串,然后在你的proc中解析它。关于此实现的许多想法here

您也可以使用APPLY传递XML并“加入”到您的proc中的XML。

在SQL 2008+可以使用Table Valued Parameters

因为我不知道你在与areaID表示参数做什么做什么,我不知道是否我已经回答了你的问题所以这里是一些更信息。

如果你想异步运行一个存储过程,你最好的选择是Service Broker,它允许你在队列中放置一个参数,并且单独的线程将处理队列。 SQL管理所有的排序,锁定,重试,产卵/杀死线程等。这是一个非常强大的系统。

有从谁似乎被连接到有关进度跟踪的OP不同的用户问题的评论。这里有一个想法:

您有一个包含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 

或者proc可能包含一个循环来处理表中的所有记录。按照John Weldon的建议,可以使用sp_start_job按需调度或调用proc。

然后,您可以查询状态如下:

SELECT COUNT(NULLIF(Status, 0))/COUNT(*) as PctComplete --in progress or complete div by total 
FROM AsynchQueue WITH NOLOCK 
WHERE BatchID = @yourBatchId 

该查询会给你完成百分比的一批。