如何使用不同的参数值集多次运行相同的存储过程,并且等待第一次执行完成。
示例:
如果我从@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#
中实现答案 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中完成。
默认情况下,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
}
}