2015-05-27 183 views
0

我必須用超過100.000個文件夾掃描120GB的網絡驅動器。我正在尋找.ini和.par文件。我最初的想法是列出所有目錄中的所有文件,然後拋出我不需要的東西。SSIS foreach循環寫入對象變量

我把一個foreach循環與在整個驅動器上,在循環中執行sql命令,在那裏我插入一個表中找到完整的文件名。

我意識到爲每個記錄寫入SQL是一個很大的性能問題,但一直無法將其寫入SSIS Object變量。將內存表寫入內存並且只有在掃描完成時,才能將它全部一次推送到SQL數據庫中,這將是一件好事。

歡迎任何想法,如果是寫入SSIS對象的解決方案,好的,如果您有更好的解決方案,非常歡迎。

+0

Sql Server 2014 Enterprise在內存表中可以用於此目的,但即使您有這種情況,仍會存在基於行的性能損失 –

+0

您是否可以爲您正在嘗試執行的操作提供更多的上下文?我可以想象如果你只是想把一個文件列表添加到數據庫中(甚至作爲一個SSIS腳本任務!),一個c#或者vb應用程序會給出更好的性能 –

+0

你可以在腳本中建立/填充你的對象變量任務。我從來沒有做過,但你可以在腳本任務中做很多事情。 –

回答

0

SSIS將只能獲取網絡上存在於共享文件夾中的文件列表。鑑於此,您可以在SSIS包中執行以下操作以獲取具有特定擴展名的所有文件的列表。以下示例基於.ini文件類型。但是您可以輕鬆地在同一個包中添加第二個進程,以便重新應用相同的兩個變量。

  1. 創建一個名爲FileList的對象變量和一個名爲File的字符串變量。
  2. 創建腳本任務以收集.ini文件,從所有子文件夾中讀取它們並將其保存到數組中。從那裏他們被保存到對象變量中。確保它在設置時在腳本的ReadWrite部分中定義。

    using System; 
    using System.Data; 
    using Microsoft.SqlServer.Dts.Runtime; 
    using System.Windows.Forms; 
    using System.IO; 
    
    namespace xxxxxx 
    { 
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 
    
        public void Main() 
        { 
         string[] ini_files = Directory.GetFiles(@"\\servername\sharedfolder", "*.ini", SearchOption.AllDirectories); 
    
         foreach (string name in ini_files) 
         { 
          Dts.Variables["User::FileList"].Value += name.ToString(); 
         } 
        } 
    } 
    

    }

  3. 創建Foreach循環容器施加,其中每個項目保存到它枚舉到文件字符串變量的對象文件列表對象變量。從那裏只需在容器中包含一個SQL腳本或數據流任務以將內容保存到數據庫表中。

    enter image description here

這只是許多方法來處理這個任務之一。這裏的方法更加模塊化,同時採用一種使用C#收集文件的快速方法。

0

根據您的評論,您沒有腳本任務選項,我想到的方法之一: - 1)您將需要創建帶有「dir%1/s/b/o:n >%2「命令將所需名稱列表的列表獲取到某個文本文件中,其中%1和%2是參數。

2)您可以添加兩種不同執行進程任務到你的包,你會增加你的批處理文件可執行對於這兩項任務和參數值將是「Z:* INI,C:\ tempSSIS \ iniList.txt「,另一個任務是」Z:*。par,C:\ tempSSIS \ parList.txt「(假設Z:\是您的網絡驅動器,第二個參數是您希望存儲的文件文件名稱列表)。

3)然後,您可以將每個執行進程任務後添加數據流任務閱讀文本文件和記錄插入到相同或不同的表。