SSIS foreach循环写入对象变量

时间:2015-05-27 14:56:42

标签: sql-server loops variables foreach ssis

我必须使用超过100.000个文件夹扫描120gb的网络驱动器。我正在寻找.ini和.par文件。我最初的想法是列出所有目录中的所有文件,然后扔掉我不需要的文件。

我在整个驱动器上放了一个带有的foreach循环,在循环中有一个execute sql命令,我在其中插入一个带有找到的完整文件名的表。

我意识到为每条记录写入SQL是一个很大的性能问题,但是无法将其写入SSIS Object变量。写入In Memory表并且仅在扫描完成时将其全部推送到SQL数据库中会很好。

欢迎所有想法,如果它是写入SSIS对象的解决方案,那么,如果您有更好的解决方案,那就非常受欢迎。

2 个答案:

答案 0 :(得分:0)

SSIS只能获取共享文件夹中存在的网络文件列表。鉴于此,您可以在SSIS包中执行以下操作,以获取具有特定扩展名的所有文件的列表。以下示例基于.ini文件类型。但是,您可以轻松地在.par文件的同一个包中添加第二个进程,其中重新应用相同的两个变量。

  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循环容器,应用对象FileList对象变量,其中保存的每个项目都枚举到File字符串变量。从那里只需在容器中包含一个SQL脚本或数据流任务,以将内容保存到数据库表中。

    enter image description here

  4. 这只是处理此任务的众多方法之一。这里的方法更加模块化,同时应用了使用C#收集文件的快速方法。

答案 1 :(得分: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)然后,您可以在每个执行流程任务之后添加数据流任务,以读取文本文件并将记录插入相同或不同的表中。