2015-07-06 92 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 
    
        } 
    }