4

我有很多文件存储在单独的文件夹中,我想将它们提取并插入到 SQL Server 数据库中的单个表中。文件夹设置如下所示:

Folder 1  
 |--> SubFolder 1.1  
 |     |--> File 1  
 |     |--> File 2  
 |--> SubFolder 1.2  
 |     |--> File 1  
 |     |--> File 2
 |--> SubFolder 1.3  
       |--> File 1  
       |--> File 2

大约有 100 个子文件夹,它们都有两个我需要提取的.txt文件。

我需要将数据加载到结构如下所示的表中

Column1         Column2     Column3     Column4     Column5     Column6  
-------------   ---------   ---------   ---------   ---------   ---------
SubFolderName   File1Col1   File1Col2   File1Col3   File1Col4   File2Col1

有人知道我如何使用 SSIS 做到这一点吗?

4

2 回答 2

3

您应该使用 中可用Traverse subfolders选项下的Foreach File Enumerator选项Foreach Loop containerForeach 循环容器可用于控制流任务。

以下是一些说明 Foreach 文件循环枚举的示例:

如何 - 任务和转换:Foreach 文件循环

SSIS 包容器 - 第 5 部分:Foreach 循环容器

我希望这有帮助。

于 2012-11-07T15:26:52.113 回答
2

您可以尝试以下步骤:

  1. 您可以使用Foreach File EnumeratorTraverse subfolders 选项来遍历文件,请记住,您应该使用并将文件Fully qualified路径保存到名为 的用户变量IncomingFile中。
  2. 您可以创建名为SubFolderName和的变量FileName
  3. 将 IncomingFile 变量作为只读变量传递,将 subfolderName 和 FileName 作为 ReadWriteVariable 传递。您可以使用脚本组件来获取子文件夹名称。

    var incomingFile = Dts.Variables["IncomingFile"].Value.ToString();
    
    FileInfo fileInfo = new FileInfo(fileFullPath);
    
    string subFolderPath = fileInfo.Directory.Name;
    string fileName = fileInfo.Name;
    
    Dts.Variables["SubFolderName"].Value = subFolderPath;
    Dts.Variables["FileName"].Value = fileName;
    
  4. 拖动连接到 ScriptComponet 的两个数据流。您应该按如下方式编写优先约束[对于两个评估操作都应该是“表达式”]。

        For DataFlow 1 -> `@FileName=="Text 1"`
        For DataFlow 2 -> `@FileName=="Text 2"`
    
  5. 在您的数据流 1 中,使用派生列并使用 SubFolderName 变量映射到示例中的“Column1”。其他列将从您的 txt 文件映射,而不是“Column6”。

  6. 在您的数据流 2 中,使用子文件夹名将数据暂存到 SQL 服务器中。

  7. 编写存储过程,通过比较子文件夹名称来更新您的第 6 列表。

  8. 用于SQL Execute task运行存储过程。

您的包裹将如下所示。

在此处输入图像描述

希望这可以帮助!

于 2012-11-08T12:18:55.913 回答