检查文件夹中是否存在文件(SSIS,SDT 2015和SQL 2016)

时间:2017-05-23 06:53:43

标签: sql ssis

我需要将多个文件加载到SQL表中。我有三种不同的格式,CSV,XLSX和XLS,但我会一次加载一种类型的文件,而不是不同文件类型的组合。

首先,如果文件存在与否,我将检查我的源文件夹。如果存在,将其加载到表并移动到下一个文件。文件检查和选择过程必须是动态的。我不想在变量中硬编码文件名。当程序包启动时,我需要filename变量来保存每次运行程序包时文件夹中存在的第一个文件。

如果在文件夹中找不到该文件,则发送该文件不存在的邮件警报。

例如,如果我的文件夹中有三个文件,

File1.csv
File2.csv
File3.csv

我运行我的包,并在第一次运行中硬编码文件名variable = File1.csv。我的包成功执行并将file1加载到表中并将其存档到存档文件夹。

当每个循环的下一次运行时,它会查找变量filename = File1,但它已经存档,因此我的包将无法从该文件夹处理file2。我该怎么做呢?

3 个答案:

答案 0 :(得分:3)

首先使用脚本任务检查文件夹中是否存在任何文件。如果找到文件,则创建一个整数变量并将其设置为1,如果找不到文件,则设置为0。在优先约束中使用表达式和约束。 http://www.techbrothersit.com/2013/07/ssis-how-to-check-if-file-exists-in.html 如果评估表达式为false,则将其连接到邮件任务,否则 连接到每个循环任务的a。 请参阅:https://www.simple-talk.com/sql/ssis/ssis-basics-introducing-the-foreach-loop-container/或更多详情。

答案 1 :(得分:1)

SSIS中的一个技巧是创建一个Foreach循环。

  • 创建一个包含文件所在路径的变量。示例用户:: filepath
  • 创建另一个变量以保存在Foreach循环中找到的实际文件,例如User :: filename

  • 从SSIS工具箱中添加Foreach循环。

  • 在Foreach循环编辑器的“集合”左侧选项卡上,选择“枚举器-Foreach文件枚举器”

  • 单击“表达式”,然后为“属性目录”添加一个,然后在表达式中选择@ [User :: filepath]

  • 在Folder上输入filepath变量的值(在执行时,将被上面的Expression覆盖,这是如果您在运行时更改了文件路径)

  • 在文件上输入或* .txt之类的内容,或者输入要应用于该文件夹的任何过滤器。

  • 在“变量映射”左选项卡上,在“变量”列上选择User :: filename变量,“索引”列将默认为0。

  • 然后将您的逻辑放入Foreach循环框中。

这只会在找到文件后执行您的逻辑。如果文件夹中存在多个文件,您还可以使用它来处理多个文件。

希望这会有所帮助。

答案 2 :(得分:1)

Foreach Loop Container 的问题是它不会处理容器内的任何任务,而是会在容器外继续处理。

解决方案是对下一个任务的约束的表达式。

enter image description here

它将检查 Foreach 循环容器中使用的可变长度。如果文件不存在,则表达式将返回 0 和 FALSE。

LEN(@[User::filePath]) > 0 ?真:假

filePath = Foreach Lop 容器变量

enter image description here