我发现SSIS(SQL Server 2005)作业存在问题,我收到以下错误:
文件名“Provider = Microsoft.Jet.OLEDB.4.0;数据源= \ UNC \ FOLDERS \ filename.xls;扩展属性=”EXCEL 8.0; HDR = YES“;”在连接中指定的无效。
我在这个网站和其他人的搜索表明,最常见的原因是权限错误,但我不相信这种情况就是这种情况,因为通过此实现成功处理了任意数量的文件。
以下是设置概述:
供应商每天向我们发送FTP文件,Windows服务选择,复制到临时目录,然后在这些文件上调用SSIS作业。每个供应商有两个SSIS作业,一个用于快照数据馈送,另一个用于事务列表。
目前整个流程中有超过50种不同的SSIS职位。除了在脚本任务步骤中因上述错误而失败的一个特定事务作业外,所有这些都有效。文件至少每天都有唯一的文件名,因此我获取作业,根据源目录确定供应商,然后根据文件名中的指示符确定文件类型,以确定要调用的SSIS作业。由于文件名每天都在变化,当服务调用SSIS作业时,我会传递一系列参数,包括供应商文件名,以便它可以正确连接到该文件。
每个作业都以脚本任务开始,该任务为作业的其余部分设置必要的变量值。例如,由于供应商文件名随每次运行而变化,我通过SSIS变量集合传递供应商文件名,然后使用该文件名作为字符串中的DataSource设置数据源的连接字符串。正是在脚本任务的那一点上发生了上述错误。这是发生错误的任务脚本代码:
Dts.Connections("Transactions File").ConnectionString = _
Dts.Variables("ConnectionString").Value.ToString().Replace("##FILE_PATH##", sourceFilePath)
ConnectionString值为:Provider = Microsoft.Jet.OLEDB.4.0; Data Source = ## FILE_PATH ##; Extended Properties =“EXCEL 8.0; HDR = YES”; sourceFilePath是处理目录
中供应商文件的完整UNC路径我不相信这是一个权限错误,因为通过此过程的所有其他文件(使用相同的保存目录进行处理)正在运行。它不应该是文件不存在的问题,因为它再次遵循与每个其他文件相同的过程,并且我已经验证文件正确地结束在正确的目录中。我还认为连接字符串可能太长,但文件路径最终为109个字符,即使使用较短(<90)的完整路径,也会发生同样的错误。
你还有什么可以让我看到的吗?谢谢你的帮助。
答案 0 :(得分:0)
根据所提供的信息,您正在做的一切都是正确的。如果您是SSIS的新手,我建议您做的一件事就是获得优秀加载项BIDSHelper的副本。它具有很多功能,可以真正节省您的时间,特别是在配置和表达方面。
我创建了一个引用包,其Excel连接管理器指向C:\ssisdata\so_paulsmithjr.xls
并将所有内容连接起来。
此时,我知道事情正在发挥作用,所以是时候让包裹移动了。我创建了以下变量及其值
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=##FILE_PATH##;Extended Properties="Excel 8.0;HDR=YES";
第四个变量设置为表达式(右键单击变量,属性窗口。将Evaluate设置为Expression = True&amp; Expression,如下所示)
REPLACE(@[User::TemplateConnection], @[User::PlaceHolder], @[User::CurrentFile])
我将CurrentConnection值与ReferenceConnection(这是Excel Connection Manager的连接字符串的原始值)进行了比较,但事情是匹配的。此时,如果我要将CurrentFile的值更改为C:\ ssisdata \ so_paulsmithjr - Copy.xls,那么它将自动反映在CurrentConnection的值中。
最后一招是在Excel连接管理器上使用Expression。再次,右键单击CM,然后在“属性”下,将显示“表达式”。它不会扩展,因为它下面没有任何东西。而是单击省略号然后选择ConnectionString属性并再次选择省略号,这次向下拖动@[User::CurrentFile]
变量。单击OK x2,现在您的连接管理器将设置为在CurrentConnection变量指定的任何位置使用。
这有效吗?