【问题标题】:ssis excel import fails if too many rows如果行太多,ssis excel 导入失败
【发布时间】:2017-12-13 18:43:04
【问题描述】:

我有一个 SSIS 包,可将 Excel 2013 (xlsx) 文件导入 SQL Server (2016) 表。我遇到的问题是,如果文件超过一定大小,包就会失败。错误是:

错误:打开“Sheet1$”的行集失败。检查对象是否存在于数据库中。 [DTS.Pipeline] 错误:“组件”验证失败,返回验证状态“VS_ISBROKEN”。

看起来好像根本看不到文件/工作表。一些有趣的笔记:

  • 无论文件大小如何,该包都可以在 SQL Server Data Tools 2015 设计器中正常工作。只有在通过集成服务目录中的 SSMS 或通过 SQL 代理作业运行时才会失败。

  • 失败的行数不是一个常数。它似乎更多地取决于导入的数据总量。例如,如果每行的字符数较小,它会在大约 25k 行时失败。如果每行有更多字符,它将失败大约 16k 行。无论哪种情况,到达故障点时的总文件大小仍然小于 1MB。

  • 我用相同的已知良好记录重复了 X 千次测试,所以我知道导致问题的不是不良记录。

  • 最初该文件位于网络共享上,但我已将其移动到直接位于服务器的驱动器上,以排除任何网络不稳定。没有变化。

  • 我在同一个 SQL 服务器上运行的其他包导入了 10 万条或更多记录,并且总文件大小要大得多(几 MB)。

有什么想法会导致这种情况吗?

【问题讨论】:

    标签: sql-server excel ssis etl


    【解决方案1】:

    这与 Excel 文件大小无关,与文件系统权限有关。只需检查以下内容:

    • SQL Server 帐户对该文件位置具有读取权限
    • 检查您是否已将Data Flow TaskDelay Validation 属性设置为true,以防您从变量中读取Excel 文件路径,或将其作为参数传递。

    【讨论】:

    • SQL Server 帐户具有访问权限。如果文件有 14,999 行,它能够导入文件,但失败有 15,000 行(只是一个例子,但我确实能够通过添加 1 行额外的“好”数据使其失败) .延迟验证设置为真(它已经设置为真)。我尝试增加和减少 DefaultBufferMaxRows 和 DefaultBufferSize,但没有区别。一旦达到一定的行数,它似乎甚至看不到文件存在。我还尝试更改为命名数据范围而不是工作表名称。没有区别。
    【解决方案2】:

    好吧,加载的数据量可能需要以较小的块进行处理,而不是一次全部读取。这减少了程序的整体内存需求,尽管这确实需要额外的逻辑来处理从一个数据块到下一个数据的转换。通常这应该运行完成就好了。另外,请参阅下面的链接,了解应该如何完成这个 ETL 小子的一些想法。

    https://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/

    【讨论】:

      【解决方案3】:

      我在底部找到了解释运行 SQL 作业的帐户必须对运行该作业的服务器上的 C\Users\Default 文件夹具有权限的 url。这是因为它将此目录用于大缓冲区。或者,您可以将运行作业的帐户添加到本地管理员帐户。 Empty Excel File permissions issue: SSIS Excel Destination buffers large record sets through C:\Users\Default

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多