我必须使用超过100.000个文件夹扫描120gb的网络驱动器。我正在寻找.ini和.par文件。我最初的想法是列出所有目录中的所有文件,然后扔掉我不需要的文件。
我在整个驱动器上放了一个带有。的foreach循环,在循环中有一个execute sql命令,我在其中插入一个带有找到的完整文件名的表。
我意识到为每条记录写入SQL是一个很大的性能问题,但是无法将其写入SSIS Object变量。写入In Memory表并且仅在扫描完成时将其全部推送到SQL数据库中会很好。
欢迎所有想法,如果它是写入SSIS对象的解决方案,那么,如果您有更好的解决方案,那就非常受欢迎。
答案 0 :(得分:0)
SSIS只能获取共享文件夹中存在的网络文件列表。鉴于此,您可以在SSIS包中执行以下操作,以获取具有特定扩展名的所有文件的列表。以下示例基于.ini文件类型。但是,您可以轻松地在.par文件的同一个包中添加第二个进程,其中重新应用相同的两个变量。
创建一个脚本任务来收集.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();
}
}
}
}
创建一个Foreach循环容器,应用对象FileList对象变量,其中保存的每个项目都枚举到File字符串变量。从那里只需在容器中包含一个SQL脚本或数据流任务,以将内容保存到数据库表中。
这只是处理此任务的众多方法之一。这里的方法更加模块化,同时应用了使用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)然后,您可以在每个执行流程任务之后添加数据流任务,以读取文本文件并将记录插入相同或不同的表中。