我一直在尝试创建一个SSIS任务,该任务从特定文件夹中拾取MS Access文件然后导出到SQL Server(如果在服务器中找到该文件/表,则跳过其他导出(。
我是SSIS的新手,我使用脚本任务动态选择文件名,然后尝试移动,但最终得到了不满意的结果。即使我在谷歌上搜索过,也没有什么想法,但还是没能按照我想要的方式找到。任何详细的帮助都会很有帮助。
注意:在这里,我并不总是确定该文件夹(即动态(的文件名
有许多用于动态选择文件的选项。由于您不确定文件名,我假设这是一个参数或变量。以下是从变量中检查文件夹中给定文件名并将其加载到SSISobject
变量的示例。然后使用Foreach Loop
将这些文件加载到SQL Server表中。您提到的是文件,而不是单个文件,因此本例假设只传入文件名的一部分,例如将日期/UID附加到文件名的开头或结尾时的情况。
- 添加一个脚本任务,参数/变量将文件和文件夹名保存为
ReadOnlyVariables
,对象变量将在执行过程中存储文件名作为ReadWriteVariable
。这方面的代码在这篇文章的末尾。string.IndexOf
方法用于检查包含给定文本的文件,StringComparison.CurrentCultureIgnoreCase
参数用于使此搜索不区分大小写。本例使用一个变量作为文件路径,使用一个参数作为文件名(在参数名中用$Package
表示( - 添加
Foreach From Variable Enumerator
枚举器类型的Foreach Loop
。将脚本任务中填充的对象变量添加为"集合"页面上的变量。在"变量映射"窗格中,在索引0处添加一个字符串变量。这需要是一个空字符串变量,用于保存每个文件的名称 - 从示例数据文件创建平面文件连接管理器。请确保正确配置了列名和数据类型。要动态设置文件名,请选择
ConnectionString
表达式(单击连接管理器的"属性"窗口中"表达式"属性的省略号(,然后从Foreach Loop
的"映射窗格"中添加相同的字符串变量 -
在
Foreach Loop
中,使用相同的连接管理器添加具有平面文件源的数据流任务。然后在目标连接中添加OLE DB或SQL Server目标,并将平面文件源连接到该目标。我发现SQL Server Destinations的性能更好,但在做出选择之前,您需要在自己的环境中验证这一点。选择必要的表,并相应地映射平面文件源中的列。List<string> fileList = new List<string>(); //get files from input directory DirectoryInfo di = new DirectoryInfo(Dts.Variables["User::FilePathVariable"].Value.ToString()); foreach (FileInfo f in di.GetFiles()) { //check for files with name containing text if (f.Name.IndexOf(Dts.Variables["$Package::FileNameParameter"].Value.ToString(), 0, StringComparison.CurrentCultureIgnoreCase) >= 0) { fileList.Add(f.FullName); } } //populate object variable Dts.Variables["User::YourObjectVariable"].Value = fileList;