Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2012 Foreach文件夹中的SSI_Sql Server_Ssis - Fatal编程技术网

Sql server SQL Server 2012 Foreach文件夹中的SSI

Sql server SQL Server 2012 Foreach文件夹中的SSI,sql-server,ssis,Sql Server,Ssis,我已经和这个问题斗争了一段时间,我似乎没有取得任何进展,我读到的一些方法似乎对我不起作用(无论出于什么原因) 我的文件夹结构如下: --Main Folder --subfolder1 --file1.txt --file2.txt --file3.txt --subfolder2 --file4.txt --file5.txt --file6.txt foreach folder

我已经和这个问题斗争了一段时间,我似乎没有取得任何进展,我读到的一些方法似乎对我不起作用(无论出于什么原因)

我的文件夹结构如下:

--Main Folder
    --subfolder1
        --file1.txt
        --file2.txt
        --file3.txt
    --subfolder2
        --file4.txt
        --file5.txt
        --file6.txt
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
使用ForEach文件枚举器,我能够处理任何给定目录中的每个文件,而不会出现任何问题,但是,我一生都无法解决如何在目录中循环

我将基本路径dir设置为变量。我试图在SSIS中实现以下目标:

--Main Folder
    --subfolder1
        --file1.txt
        --file2.txt
        --file3.txt
    --subfolder2
        --file4.txt
        --file5.txt
        --file6.txt
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文件枚举器不返回目录。直到我开始回答这个问题,我才意识到这一点

设置 我在基本文件夹下创建了一系列文件夹和文件,如您所示

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-string-Value不重要
  • CurrentFolder-string-值不重要
  • FolderBase-string-将此值设置为要处理的基本/根/父文件夹
  • 子文件夹列表-对象

第一轮 我最初的构建看起来像

FELC过程文件夹 我将其设置为@[User::FolderBase]目录,并取消选中左遍历子文件夹。“我的变量映射”选项卡使用User::CurrentFolder作为索引0

FELC过程文件 我使用@[User::CurrentFolder]目录进行设置,并且我的变量映射选项卡使用User::CurrentFile作为索引0

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

  • 只读变量:用户::当前文件,用户::当前文件夹
  • 读写变量:
代码很简单

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库查找

  • 只读变量:用户::当前文件
  • 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;
}
可控硅发射 同上

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

SCR生成子文件夹列表 使用Directory.GetDirectories的静态方法返回文件夹列表的脚本任务

  • 只读变量:User::FolderBase
  • ReadWriteVariables:用户::子文件夹列表
代码也很简单

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

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

可控硅发射 同上

结果 正如你所看到的,我在方法2和方法3中得到了相同的结果。这取决于什么对你的特定用例更有意义


您是否尝试过在主文件夹上使用“遍历子文件夹”进行ForEach文件循环选项已启用?Traverse subfolders的工作原理是,它为我提供了所有文件名,但就我所知,它没有为我提供文件夹名/路径。如果所有其他操作都失败,使用FileSystemObject的脚本任务应该可以工作。感谢您提供了非常完整且结构良好的答案!