首页 > 解决方案 > 如何在 SSIS foreach 循环容器中使用带有文件名字母的通配符

问题描述

SSIS 中的 for each 循环编辑器带有一个选项,可以选择循环枚举器作为 Foreach 文件枚举器,在该选项下我试图使用通配符来避免额外的脚本任务,但文件未被读取。我有以扩展名 .csv 结尾的文件列表,所以如果我这样做 *.csv 它将读取所有文件,但我想要仅以“_names.csv”结尾的文件,但是如果包无法读取任何文件我这样做。我附上了我的 Foreach 循环编辑器设置的屏幕截图。任何想法我做错了什么?我在 PowerShell 中使用 ls -file *_names.csv 测试了这个通配符,我得到了过滤后的文件列表。

在此处输入图像描述

标签: foreachssis

解决方案


它对我有用,所以您的情况可能有其他问题。

设置

在磁盘上,我的 Input 文件夹中有 3 个文件,只有一个符合预期条件

  • C:\ssisdata\so\input\foo_names.csv
  • C:\ssisdata\so\input\norms.csv
  • C:\ssisdata\so\input\no_names.csvv

我的 SSIS 包有 3 个变量,都是字符串类型。

  • CurrentFileName - 这是在我的 ForEach 循环的每次迭代中填充的
  • FileNameFilter - 这是 *_names.csv
  • FolderName - 这指向 C:\ssisdata\so\input

在此处输入图像描述

在此处输入图像描述

脚本任务只是将变量值打印到输出/结果选项卡的一小段代码。命名空间将根据单击创建脚本任务的随机性而有所不同

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace ST_6da5625c3b1a4e13988a4a2c68531e4d
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        public void Main()
        {
            bool fireAgain = false;
            foreach (var item in Dts.Variables)
            {
                Dts.Events.FireInformation(0, "SCR Echo Back", string.Format("{0}:{1} -> {2}", item.Namespace, item.Name, item.Value), "", 0, ref fireAgain);
            }

            Dts.TaskResult = (int)ScriptResults.Success;
        }
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
    }
}

测试用例

我使用的第一个案例是一个简单的 *.csv 以确保是的,我正在查看文件。这消除了诸如权限或损坏路径问题之类的问题。如果这是路径/权限问题,您将看到以下警告

警告:FELC 名称 csv 处的 0x8001C004:For Each File 枚举器为空。For Each File 枚举器未找到任何与文件模式匹配的文件,或者指定的目录为空。

关于 *.csv 迭代需要注意的一点,它拿起了 no_names.csvv 为什么?因为它是为 8.3 名称设计的。由于我太懒了,所以没有给出引用

然后我使用 N*.csv 作为我的下一次迭代。它按预期拾取了 norms.csv 和 no_names.csvv。

最后,我使用原始 *_names.csv 作为我的输入过滤器,它正确地选择了 foo_names.csv

输出

SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\so_69215306.dtsx" starting.
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:FileNameFilter -> *.csv
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:FolderName -> C:\ssisdata\so\input
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:CurrentFileName -> C:\ssisdata\so\input\foo_names.csv
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:CurrentFileName -> C:\ssisdata\so\input\norms.csv
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:CurrentFileName -> C:\ssisdata\so\input\no_names.csvv
SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\so_69215306.dtsx" finished: Success.

SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\so_69215306.dtsx" starting.
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:FileNameFilter -> N*.csv
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:FolderName -> C:\ssisdata\so\input
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:CurrentFileName -> C:\ssisdata\so\input\norms.csv
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:CurrentFileName -> C:\ssisdata\so\input\no_names.csvv
SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\so_69215306.dtsx" finished: Success.
The program '[49988] DtsDebugHost.exe: DTS' has exited with code 0 (0x0).

SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\so_69215306.dtsx" starting.
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:FileNameFilter -> *_names.csv
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:FolderName -> C:\ssisdata\so\input
Information: 0x0 at SCR Echo Back, SCR Echo Back: User:CurrentFileName -> C:\ssisdata\so\input\foo_names.csv
SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\so_69215306.dtsx" finished: Success.

推荐阅读