2015-07-06 60 views
-1

我开发了一个主包(Main.dtsx)和三个子包(Processor.dtsx)。注意:代码对于从源位置和进程中拾取文件的所有子包都是相同的。为了优化性能,我希望所有这三个子包都应该在10000个文件上同时运行,这样第一个孩子将选择第一个文件并开始执行,同时第二个孩子将拾取第二个文件等等。如果您有,请分享代码。我尝试使用'MaxConcurrentExecutables'选项,但是在这种情况下,所有组件都访问不同的文件。ssis中的并行执行

回答

0

这不能在foreach循环来完成,但是你可以用一个脚本任务完成的任务:

  1. 添加3个字符串变量来保存的文件名(即文件1,文件2,文件3)
  2. 将主包中的变量传递给每个子包。
  3. 在每个子包中,在文件连接管理器中配置一个表达式以使用该参数作为连接字符串
  4. 在每个包的末尾,确保文件从源文件夹移动或在这样的文件夹中重命名这种方式会在随后的循环中被忽略。
  5. 设置一个For循环,当所有文件都被处理完毕后,For循环会结束。您可以将一个布尔变量添加到程序包中,例如“ProcessingIsAllDone”,然后在脚本任务中进行设置。
  6. 在For循环的顶部添加一个脚本任务,并将执行包任务与前面的约束连接起来。
  7. 使用下面的脚本来设置变量

    using System; 
    using System.Data; 
    using Microsoft.SqlServer.Dts.Runtime; 
    using System.Windows.Forms; 
    using System.IO; 
    
    namespace ST_e4ccd9cfaa4847ff86ec88c215c1961c 
    { 
        [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
        public partial class ScriptMain :  Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
        { 
         public void Main() 
         { 
          DirectoryInfo sourceDirectory = new DirectoryInfo(@"c:\temp"); 
          int loops = 3; 
          foreach (FileInfo sourceFile in sourceDirectory.GetFiles("*.txt")) 
          { 
           if (loops == 0) 
           { 
            break; 
           } 
           string variableName = String.Format("File{0}", loops); 
           Dts.Variables[variableName].Value = sourceFile.FullName; 
           loops--; 
          } 
          if (sourceDirectory.GetFiles("*.txt").Length <= 3) 
          { 
           Dts.Variables["ProcessingIsAllDone"].Value = true; 
          } 
          Dts.TaskResult = (int)ScriptResults.Success; 
         } 
    
        #region ScriptResults declaration 
        enum ScriptResults 
        { 
         Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
         Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
        }; 
        #endregion 
    
        } 
    }