2

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

例子:

如果我从@sourceId,@containerId 得到proc sp_loaddata

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# 中实现这一点

4

3 回答 3

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);
于 2013-04-03T06:34:23.637 回答
1

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

于 2013-04-03T06:29:01.300 回答
1

这可以在 SSIS 中通过使用 3 个Execute SQL Task彼此不连接的不同来完成。

在此处输入图像描述

默认情况下,SSIS 使用Serializable选项Isolation Level锁定正在读取的整个数据并保持锁定直到事务完成。因此,为了并行运行查询,您需要在读取数据时将其更改Isolation levelSnapshot主要用于数据的。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
    }
}
于 2013-04-03T06:52:21.570 回答