动态分配文件名到Excel连接字符串

24

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

输入图像描述

我所做的就是用一个表达式替换Excel连接管理器中的硬编码连接字符串,该表达式接受由表达式分配的变量的值

输入图像描述

在数据流任务开始之前,该变量被赋予了值。变量已经检查并具有正确的值。

输入图像描述

但是,在数据流任务开始时却产生了下面的错误。

输入图像描述

如果有人能指出我做错了什么并建议我如何解决这个问题,那将不胜感激。

3个回答

33

选项A

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

相反,将一个表达式放在Excel连接管理器的ExcelFilePath属性上。

enter image description here

理论上,ConnectionString和ExcelFilePath之间没有区别,除了你要更多的“东西”来构建出正确的连接字符串。

此外,请确保您在32位模式下执行包。

选项B

你可能会遇到的另一种选择是,在运行时连接字符串的设计时值是无效的。当包开始时,它验证所有预期资源是否可用,如果不可用,则会快速失败而不是在加载过程中死亡。你可以将此验证延迟到SSIS实际访问资源时,并通过将DelayValidation属性设置为True来实现这一点。这个属性存在于SSIS中的所有内容中,但我首先会在Excel连接管理器上设置它。如果仍然抛出Package Validation错误,请尝试将数据流的延迟验证也设置为True。


非常感谢您的解决方案。您的B选项单独就可以解决问题!所以基本上将DelayValiday设置为true就可以解决问题了!FYI:您的第一个选项不起作用,因为正如您所说,ConnectionString上有更多的内容而不仅仅是路径。如果我设置ExcelFilePath,我可能还需要对连接字符串进行其他操作,以使其接受excelfilepath中的内容,否则它仍将硬编码为原始内容,或者如果为空,则会失败。 - user1205746
@user1205746 - 更新ExcelFilePath会自动覆盖连接字符串中的路径,因此按照所述更容易实现,而不是自己构建连接字符串。我之前一直在这样做,但由于文件在程序包运行时不存在(它是作为较早步骤下载的),所以我遇到了与您相同的问题,但选项B解决了这个问题。 - ikariw
1
将 DelayValidation 设置为 True 后,如果仍然无法正常工作,请单击 Excel 任务并将 ValidateExternalMetaData 设置为 false。这将解决该任务抛出错误的问题,并且您可以动态添加数据源。 - Sai Bhasker Raju
1
选项B,附加设置在数据流中。在我的情况下是一个序列容器。 - frostymarvelous
@rpd 尝试在网站上提出正式问题,并提供所有细节(通常有屏幕截图会更有帮助)。 - billinkc
显示剩余3条评论

1

我花了很长时间才让它正常工作,即使按照所有指示进行操作,所以我只是将其保留为静态的 Excel 名称,并添加了“文件系统任务”来复制文件并创建一个需要的任何名称的新文件。


1
我理解你的痛苦,你的方法简单易行。 - Ab Bennett

1
我们可以像下面这样在Expression中定义我们的连接字符串:
Provider=Microsoft.ACE.OLEDB.12.0;

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

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

我一直在努力解决使用SSIS字符串变量作为要加载的Excel文件名的问题。我尝试了之前描述的使用ExcelFilePath和DelayValidation属性的方法,但没有成功。但是我可以确认设置ConnectionString属性的这种方法确实有效。 - Ubercoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接