同时运行存储过程多次

时间:2013-04-03 06:24:23

标签: c# sql-server-2008 tsql ssis

如何使用不同的参数值集多次运行相同的存储过程,并且等待第一次执行完成。

示例:

如果我从@sourceId获取proc sp_loaddata,@ continerId

Execution - 1st:  exec sp_loaddatafrom 100001, 36
Execution - 2nd:  exec sp_loaddatafrom 100008, 92
Execution - 3rd:  exec sp_loaddatafrom 100005, 112

我希望所有人同时进行。

如何在T-SQL / SSIS / C#

中实现

3 个答案:

答案 0 :(得分:3)

如果您有权访问.net 4.5,我会使用以下代码。

var results = Task.WhenAll(
    Task.Run(() => RunStoredProc(1)),
    Task.Run(() => RunStoredProc(2)),
    Task.Run(() => RunStoredProc(3))
).Result;

如果我只有.net 4.0,我会使用TPL。有点麻烦,仍然比背景工作者好。

var arguments = new []{1,2,3};

var results = from x in arguments.AsParallel()
              select RunStoredProc(x);

答案 1 :(得分:1)

如果您将使用C#,您可以使用3个BackgroundWorkers在其Do_Work事件上调用所述存储过程

答案 2 :(得分:1)

这可以通过使用3个不相互连接的Execute SQL Task在SSIS中完成。

enter image description here

默认情况下,SSIS对Serializable使用Isolation Level选项,该选项锁定正在读取的整个数据并保持锁定直到事务完成。因此,为了并行运行查询,您需要将Isolation level更改为Snapshot,在读取数据时基本上使用NOLOCK

更新: -

由于正在执行stored procedures的次数为dynamically,因此您需要创建包programitically

public void CreatePackage()
{
  Package package= new Package();
  ConnectionManager sqlConnection = GetSQLConnection(package,
                                    "localhost", "Database Name");
  TaskHost taskHost=null;
   for(int i=0;i<GetNoOfRowFromSQL();i++)
    {
      CreateDynamicTask(package);
    }
  package.Execute();
}

public void CreateDynamicTask(package Package)
{

      //Add the Execute SQL Task
      package.Executables.Add("STOCK:SQLTask");
       taskHost = package.Executables[0] as TaskHost;
      taskHost.Properties["SqlStatementSource"].SetValue(taskHost, 
                                            "EXECUTE Stored Proc);
     //Setting the Isolation Level
     taskHost.Properties["IsolationLevel"].SetValue(taskHost, 1048576);
     //the number signify 1048576 =Serializable
    }
}