foreach - 如何在 SSIS foreach 循环容器中使用带有文件名字母的通配符
问题描述
SSIS 中的 for each 循环编辑器带有一个选项,可以选择循环枚举器作为 Foreach 文件枚举器,在该选项下我试图使用通配符来避免额外的脚本任务,但文件未被读取。我有以扩展名 .csv 结尾的文件列表,所以如果我这样做 *.csv 它将读取所有文件,但我想要仅以“_names.csv”结尾的文件,但是如果包无法读取任何文件我这样做。我附上了我的 Foreach 循环编辑器设置的屏幕截图。任何想法我做错了什么?我在 PowerShell 中使用 ls -file *_names.csv 测试了这个通配符,我得到了过滤后的文件列表。
解决方案
它对我有用,所以您的情况可能有其他问题。
设置
在磁盘上,我的 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.
推荐阅读
- php - CodeIgniter 会话未设置(试图在回调函数中设置会话)
- flutter - 如何在颤动中更改抽屉图标?
- python - 如何在python(pycharm)中将NumPy数组保存到PDB(蛋白质数据库)格式的文件
- node.js - Issue when deploying with Heroku (Error 504)
- sql - 使用postgres json当键为空时删除行
- django - Django 与 Graphos 使用 csv
- python - 为什么外部 Python 脚本的输出没有显示在我的 Python Tkinter GUI 中?
- c++ - Mac Catalina Clang 无法在 /usr/local/include 中找到头文件
- rust - 有一个悬空指针是否安全?
- php - 从单个 wp_editor 中删除工具栏