我正在创建一个SSIS包,第一步是获取存储在文件中的文件列表,并将此信息存储在一个对象变量中。我将此变量传递给尝试打开文件列表的任务。但是,如果由于文件夹为空而没有要打开的文件,则打开文件任务将失败。
我对使用SSIS相对较新,并且对如何重写一个表达式很好奇,该表达式检查对象变量是否为空以及是否为空而不允许打开文件任务运行。
答案 0 :(得分:4)
您不需要使用对象变量来遍历文件夹中的文件。您可以使用Foreach Loop Container
轻松实现这一目标。以下示例演示了如何完成此操作。该示例是在SSIS 2008 R2
。
分步流程:
假设我们需要遍历路径C:\ temp中的文件,如屏幕截图# 1 所示。
在SSIS包中,创建三个变量,即 FolderPath , FilePattern 和 FilePath 。请参阅屏幕截图# 2 。将FolderPath
变量设置为您要循环的文件夹,在这种情况下,我选择了C:\temp
。将FilePattern
变量设置为文件应匹配的模式,这里我想遍历所有文件,因此我使用了*.*
。如果您只想循环使用Excel 2010文件,则可以使用*.xlsx
。它只能接受一种模式。不要将任何值设置为变量FilePath
,因为当Foreach循环容器循环遍历文件夹中的每个文件时,将为其赋值。
在包的控制流标签上,放置Foreach Loop container
,然后将一个脚本任务放在Foreach循环容器中。在这个例子中,我们将简单地遍历每个文件并显示它们的名称,而不是做更多的事情。请参阅屏幕截图# 3 。
配置Foreach循环容器,如屏幕截图# 4 和# 5 所示。在集合部分,我们已将表达式配置为使用变量FolderPath
和FilePattern
。在变量映射部分,我们告诉容器将文件路径值存储到FilePath
变量中。
在脚本任务中,将Main()方法代码替换为脚本任务代码部分下给出的代码。代码中没有什么花哨的东西。它只是在消息框中显示文件路径。
屏幕截图# 6 - # 11 显示示例包执行以及文件夹中每个文件的循环方式。请注意屏幕截图# 11 ,脚本任务标有绿色颜色,表明程序包已成功执行任务。
现在,让我们删除文件夹C:\ temp中的所有文件,如屏幕截图# 12 所示。
如果我们现在执行包,Foreach循环容器中的任务将不会执行,因为没有要循环的文件且文件夹为空。请参阅屏幕截图# 13 。请注意,脚本任务标有白色颜色,表明程序包未执行脚本任务,并且跳过了该部分。
这只是一个简单的例子。您可以做的不仅仅是显示文件的名称。您可以在Foreach循环容器中执行其他任务,并传递FilePath
变量来处理文件。
希望有所帮助。
脚本任务代码:
C#代码,只能在 SSIS 2008 and above
中使用。
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForWrite("User::FilePath");
Dts.VariableDispenser.GetVariables(ref varCollection);
MessageBox.Show(varCollection["User::FilePath"].Value.ToString(), "File Path");
Dts.TaskResult = (int)ScriptResults.Success;
}
屏幕截图#1:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#10:
屏幕截图#11:
屏幕截图#12:
屏幕截图#13: