动态地将文件名指定给excel连接字符串

时间:2014-02-03 20:09:18

标签: ssis sql-server-2012

这是我第一次在SQL Server 2012中使用SSIS。我可以成功读取excel文件并将其内容加载到SQL Server 2012中的表中。该任务是一个简单的直接读取excel文件然后复制到sql server暂时没有验证或转换。任务很成功。但是当我试图让包从变量而不是原始的硬编码中读取文件名时,它产生了一个错误“DTS_E_OLEDBERROR。发生了OLE DB错误。错误代码:0x80040E4D”

enter image description here

我所做的只是用一个表达式替换excel连接管理器中的硬编码连接字符串,该表达式获取由表达式指定的变量的值

enter image description here

在数据流任务开始之前为变量分配了值。检查变量并确实具有正确的值。

enter image description here

但是下面的错误是在数据流任务开始时生成的。

enter image description here

如果有人能指出我做错了什么并告诉我如何解决问题,我们将非常感激。

3 个答案:

答案 0 :(得分:28)

选项A

Excel连接管理器的ConnectionString属性不是我操作当前文件的地方,这与普通的平面文件连接管理器形成对比。

而是将表达式放在Excel连接管理器的ExcelFilePath属性中。

enter image description here

理论上,ConnectionString和ExcelFilePath之间应该没有区别,除了你有更多的东西"构建以获得恰到好处的连接字符串。

另外,请确保以32位模式执行包。

选项B

您可能遇到的另一种方法是,连接字符串的设计时值一旦运行就无效。当程序包开始时,它会验证所有预期的资源是否可用,如果它们不是,它会快速失败而不是在负载中死亡。您可以延迟此验证,直到SSIS必须实际访问资源为止,并通过将DelayValidation属性设置为True来执行此操作。此属性存在于SSIS中的所有内容中,但我首先要在Excel连接管理器上进行设置。如果仍然会引发程序包验证错误,请尝试将数据流的延迟验证设置为true。

答案 1 :(得分:1)

即使按照所有说明进行操作,我也有一段时间尝试使其工作,所以我只是使用静态excel名称对其进行了保存,并添加了“文件系统任务”来复制文件并创建一个新文件。我需要的任何名称的文件。

答案 2 :(得分:1)

我们可以像下面的表达式中那样定义连接字符串:

Provider=Microsoft.ACE.OLEDB.12.0;

Data Source=" + @[User::InputFolder] + "\\"+ @[User::FileName] +";

Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";