【问题标题】:Dynamically assign filename to excel connection string将文件名动态分配给 excel 连接字符串
【发布时间】:2014-02-03 20:09:18
【问题描述】:

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

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

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

但是数据流任务启动时出现下面的错误。

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

【问题讨论】:

    标签: sql-server ssis sql-server-2012 etl


    【解决方案1】:

    选项 A

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

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

    理论上,ConnectionString 和 ExcelFilePath 之间应该没有区别,只是您需要构建更多“东西”来获得恰到好处的连接字符串。

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

    选项 B

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

    【讨论】:

    • 非常感谢您的解决方案。您的选项 B 单独有效!所以基本上将 DelayValiday 设置为 true 将解决问题!仅供参考:您的选项之一不起作用,因为正如您所说,ConnectionString 上有更多的东西,而不仅仅是路径。如果我设置 ExcelFilePath,我可能还需要对连接字符串进行一些其他操作,以使其获取 excelfilepath 中的内容,否则它仍然会像原始文件一样硬编码,或者如果它为空白则会爆炸
    • @user1205746 - 更新 ExcelFilePath 将自动覆盖连接字符串中的路径,因此按照说明更容易做到这一点,而不是自己构建连接字符串。我正在这样做,但是因为我的文件在运行包时不存在(它是在前面的步骤中下载的)我遇到了和你一样的问题,但是选项 B 解决了它。
    • 这两个选项对我都不起作用,仅验证在选项 B 中,将 ConnectionString 表达式中的值 -rely 设置为“Excel 连接管理器”属性的正确位置是什么?路径格式是否应该与 ExcelFilePath 相同,例如“C:\Projects\Result Files\00000_30-06-2016.xls”?
    • 将 DelayValidation 设置为 True 后,如果仍然无效,请单击 excel 任务并将 ValidateExternalMetaData 设置为 false 。这将解决该任务引发错误,您可以动态添加数据源
    • 选项 B 以及在数据流上设置它的附加信息。在我的例子中是一个序列容器。
    【解决方案2】:

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

    【讨论】:

    • 我听到了你的痛苦,你的方式比装船更简单
    【解决方案3】:

    我们可以在表达式中定义我们的连接字符串,如下所示:

    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 属性的方法确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多