如果行太多

时间:2017-12-13 18:43:04

标签: sql-server excel ssis etl

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

  

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

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

  • 无论文件大小如何,该程序包在SQL Server Data Tools 2015设计器中都能正常运行。它只在通过Integration Services目录中的SSMS运行或通过SQL代理作业运行时失败。

  • 失败的行数不是常量。它似乎更依赖于导入的数据总量。例如,如果每行的字符较小,则会在大约25k行时失败。如果每行有更多字符,则会失败大约16k行。在任何一种情况下,达到故障点时的总文件大小仍然小于1MB。

  • 我已经用相同的已知良好记录进行了测试,重复了一千次,所以我知道这并不是导致这个问题的错误记录。

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

  • 我在同一个SQL服务器上运行其他程序包,导入100k或更多记录,总文件大小(几MB)。

对于会导致这种情况的任何想法?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

嗯,加载的数据量可能需要以较小的块处理,而不是一次性读取。这降低了程序的整体内存需求,但这确实需要额外的逻辑来处理从一个数据块到下一个数据块的转换。通常情况下这应该很好地完成。另外,请参阅下面的链接,了解如何完成这个ETL孩子的一些想法。

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

答案 2 :(得分:0)

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