我需要将多个文件加载到SQL表中。我有三种不同的格式,CSV,XLSX和XLS,但我会一次加载一种类型的文件,而不是不同文件类型的组合。
首先,如果文件存在与否,我将检查我的源文件夹。如果存在,将其加载到表并移动到下一个文件。文件检查和选择过程必须是动态的。我不想在变量中硬编码文件名。当程序包启动时,我需要filename变量来保存每次运行程序包时文件夹中存在的第一个文件。
如果在文件夹中找不到该文件,则发送该文件不存在的邮件警报。
例如,如果我的文件夹中有三个文件,
File1.csv
File2.csv
File3.csv
我运行我的包,并在第一次运行中硬编码文件名variable = File1.csv
。我的包成功执行并将file1加载到表中并将其存档到存档文件夹。
当每个循环的下一次运行时,它会查找变量filename = File1,但它已经存档,因此我的包将无法从该文件夹处理file2。我该怎么做呢?
答案 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循环。
创建另一个变量以保存在Foreach循环中找到的实际文件,例如User :: filename
从SSIS工具箱中添加Foreach循环。
在Foreach循环编辑器的“集合”左侧选项卡上,选择“枚举器-Foreach文件枚举器”
单击“表达式”,然后为“属性目录”添加一个,然后在表达式中选择@ [User :: filepath]
在Folder上输入filepath变量的值(在执行时,将被上面的Expression覆盖,这是如果您在运行时更改了文件路径)
在文件上输入。或* .txt之类的内容,或者输入要应用于该文件夹的任何过滤器。
在“变量映射”左选项卡上,在“变量”列上选择User :: filename变量,“索引”列将默认为0。
然后将您的逻辑放入Foreach循环框中。
这只会在找到文件后执行您的逻辑。如果文件夹中存在多个文件,您还可以使用它来处理多个文件。
希望这会有所帮助。
答案 2 :(得分:1)
Foreach Loop Container 的问题是它不会处理容器内的任何任务,而是会在容器外继续处理。
解决方案是对下一个任务的约束的表达式。
它将检查 Foreach 循环容器中使用的可变长度。如果文件不存在,则表达式将返回 0 和 FALSE。
LEN(@[User::filePath]) > 0 ?真:假
filePath = Foreach Lop 容器变量