【问题标题】:SSIS in SQL Server 2012 Foreach FolderSQL Server 2012 Foreach 文件夹中的 SSIS
【发布时间】:2015-06-26 19:56:22
【问题描述】:

我一直在与这个问题作斗争一段时间,但我似乎没有取得任何进展,而且我阅读过的几种方法似乎对我不起作用(无论出于何种原因) .

我的文件夹结构如下:

--Main Folder
    --subfolder1
        --file1.txt
        --file2.txt
        --file3.txt
    --subfolder2
        --file4.txt
        --file5.txt
        --file6.txt

使用 ForEach File 枚举器,我可以毫无问题地处理任何给定目录中的每个文件,但是我终其一生都无法弄清楚如何遍历目录。

我有一个基本路径目录设置为变量。我想在 SSIS 中达到的目的如下:

foreach folder in mainfolder
do
    set variable to the folder name (i.e. subfolder1 (no path))
    foreach file in folder
    do
        Process File steps (can do this currently by specifying one of the sub folders)
    done
done

希望这是有道理的。

正如我之前提到的,我尝试了几种方法,包括一个脚本来构建一个包含每个文件夹路径的 XML blob,然后遍历节点,但是这不起作用,我相信一定有一个更简单的方法方法。

总而言之,我需要一个 foreach 文件夹外部循环,它将一个变量设置为文件夹名称,以便我可以将现有的 foreach 文件循环嵌套在其中。

可能是我正在尝试做一些 SSIS 无法做到的事情,我觉得应该这样做,因为我在编程语言中做过类似的事情

【问题讨论】:

  • 您是否在主文件夹上尝试了 ForEach 文件循环,并启用了“遍历子文件夹”选项?
  • 遍历子文件夹的工作原理是它给了我所有的文件名,但据我所知,它没有给我文件夹名称/路径
  • 如果一切都失败了,使用 FileSystemObject 的脚本任务应该可以工作。

标签: sql-server ssis


【解决方案1】:

Foreach 文件枚举器不返回目录。直到我开始回答这个问题,我才意识到这一点。

设置

我在基本文件夹下创建了一系列文件夹和文件,就像你指出的那样

C:\SSISData\31081157
C:\SSISData\31081157\Subfolder1
C:\SSISData\31081157\Subfolder2
C:\SSISData\31081157\Subfolder1\file1.txt
C:\SSISData\31081157\Subfolder1\file2.txt
C:\SSISData\31081157\Subfolder1\file3.txt
C:\SSISData\31081157\Subfolder2\file4.txt
C:\SSISData\31081157\Subfolder2\file5.txt
C:\SSISData\31081157\Subfolder2\file6.txt

我用 4 个变量构建了一个包

  • CurrentFile - 字符串 - 值无关紧要
  • CurrentFolder - 字符串 - 值无关紧要
  • FolderBase - 字符串 - 将此值设置为 base/root/parent 文件夹以进行处理
  • 子文件夹列表 - 对象

第一轮

我最初的构建看起来像

FELC 工艺文件夹

我使用@[User::FolderBase] 的目录来设置它,并且未选中遍历子文件夹。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0

FELC 处理文件

我使用 @[User::CurrentFolder] 的目录设置它,我的变量映射选项卡使用 User::CurrentFile 作为索引 0

SCR 发射

这是一个脚本任务,它接受两个只读参数:UserFolder 和 UserBase。我只是通过引发 OnInformation 事件(显示在您的“进度”选项卡中)来使用它来显示当前值。

  • ReadOnlyVariables:User::CurrentFile,User::CurrentFolder
  • ReadWriteVariables:

代码很简单

public void Main()
{
    bool fireAgain = false;
    string folderName = this.Dts.Variables["User::CurrentFolder"].Value.ToString();
    string fileName = this.Dts.Variables["User::CurrentFile"].Value.ToString();
    string message = string.Format("Folder = {0} : File = {1}", folderName, fileName);
    Dts.Events.FireInformation(0, "Emit", message, string.Empty, 0, ref fireAgain);

    Dts.TaskResult = (int)ScriptResults.Success;
}

但它永远不会触发内部 foreach 循环,因为外部循环中没有文件。哎呀

第二轮

这可能是我首先解决这个问题的方法。 我没有先找出所有目录,而是简单地遍历树,然后找出我在哪里。

FELC 子文件夹

我使用@[User::FolderBase] 的目录设置它,并检查左遍历子文件夹。我的变量映射选项卡使用 User::CurrentFile 作为索引 0

SCR 分配当前文件夹

这是一个脚本,它将使用 .NET 库来查找 containing folder

  • ReadOnlyVariables: User::CurrentFile
  • ReadWriteVariables: User::CurrentFolder

代码保持简单

public void Main()
{
    string currentFile = this.Dts.Variables["User::CurrentFile"].Value.ToString();
    string parent = System.IO.Directory.GetParent(currentFile).FullName;
    this.Dts.Variables["User::CurrentFolder"].Value = parent;
    Dts.TaskResult = (int)ScriptResults.Success;
}

SCR 发射

同上

第三轮

这假设您在深入了解该文件夹之前必须知道该文件夹。在这种情况下,我们将再次返回 .NET 库来检查文件系统,但现在我们将使用子文件夹列表填充最后一个变量 User::SubFolderList。从技术上讲,它是一个字符串数组,但没关系。

SCR 生成子文件夹列表

使用 Directory.GetDirectories 中的静态方法返回文件夹列表的脚本任务。

  • ReadOnlyVariables: User::FolderBase
  • ReadWriteVariables: User::SubFolderList

代码也很简单

public void Main()
{
    string folder = this.Dts.Variables["User::FolderBase"].Value.ToString();
    this.Dts.Variables["User::SubFolderList"].Value = System.IO.Directory.GetDirectories(folder);

    Dts.TaskResult = (int)ScriptResults.Success;
}

FELC 处理子文件夹列表

这是一个 Foreach 枚举器,但我们必须将文件类型从文件列表设置为 Foreach From Variable Enumerator。作为您的变量,您将使用@[User::SubFolderList]。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0

当前文件夹中的 FELC 处理文件

既然我们知道 CurrentFolder 是什么,那么我们将使用 Foreach 文件枚举器并指定 @[User::CurrentFolder] 的目录。我将变量映射选项卡设置为使用 User::CurrentFile 作为索引 0

SCR 发射

同上

结果

如您所见,我使用方法 2 和 3 得到相同的结果。这仅取决于对您的特定用例更有意义的方法。

【讨论】:

  • 感谢您提供非常完整且结构合理的答案!
猜你喜欢
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多