【问题标题】:SSIS: failed to retrieve long data / truncation errorsSSIS:未能检索到长数据/截断错误
【发布时间】:2024-01-17 19:24:01
【问题描述】:

在尝试从一组 Excel 电子表格中导出数据时,我遇到了这两个错误中的任何一个。 简化场景:

  • 两个包含 1 个文本列的 Excel 电子表格
  • 在文件 1 中,文本永远不会超过 200 个字符
  • 在第二个 - 它是。

SSIS 假设从文件夹中自动导入它们 - 简单易行,但是... Excel 源组件决定了此处使用的数据类型。

当使用由我创建的带有示例文本数据的示例文件时,它决定使用 DT_WSTR(255) 失败,第二个文件出现截断错误。

当我强制它使用 DT_NTEXT(通过在示例文件中创建更长的文本)如果失败,第一个文件抱怨“无法检索列的长数据”......因为第一个文件不包含更长的文本...

有没有人为此找到解决方案/解决方法?我的意思是 - 除了手动更改源数据?

非常感谢任何帮助。

【问题讨论】:

  • 您需要更改注册表设置,TypeGuessRows: mssqltips.com/sqlservertip/2770/…
  • @MarkWojciechowicz - 这样做没有意义。它的作用是在设置为 0 时检查您的所有数据(好吧,不是全部 - 直到一定数量的行 - 不记得确切的数字)。这里的情况是已经知道这些文本条目有多长。问题是excel源做出的“决定”......一个文件可以,但另一个文件不行,它们是通过相同的自动化过程导入的......
  • 问题是它默认根据前 8 行做出决定。第二个文件的前 8 行数据与第一个文件不同。在这种情况下,Excel 做出了错误的决定。强制它查看整个列将阻止它更改数据类型。我会尝试一下,这是处理 excel 文件时的常见问题,这是让 excel 返回正确数据类型的可靠方法。

标签: excel import ssis export


【解决方案1】:

我们可以使用平面文件连接管理器而不是 Excel 连接管理器。当我们创建平面文件连接管理器时,我们可以明确地设置数据类型和长度。为此,我们首先需要将 excel 文件保存为 csv 文件或制表符分隔文件。然后我们可以使用这个文件来创建平面文件连接。在数据流选项卡中拖放一个平面文件源。在平面文件源编辑器对话框中单击新建按钮,它将启动平面文件连接管理器编辑器对话框。在“常规”选项卡中指定文件完整路径,然后单击“高级”选项卡。然后像下图一样输入数据类型和列宽。

单击确定并关闭对话框,这将创建我们的连接管理器。现在连接管理器可以成功读取全长数据,但是我们必须设置输出列的数据类型和长度,以便我们可以在输出管道中获取数据。为此,右键单击平面文件源,然后单击显示高级编辑器选项。然后按照下面的图片说明进行操作。

完成后,我们运行我们的包,它成功运行,没有任何截断错误,并将所有数据插入我们的目标数据库。

【讨论】: