SSIS将Excel导入到SQL截断问题

时间:2018-11-11 05:38:29

标签: sql sql-server excel ssis truncation

我正在使用SSIS 2012和SQL Server2014。我一直遇到这个问题,并且希望看到可行的解决方案-而且我不确定为什么更多的人不会遇到这个问题。这是我简单的数据流任务:

enter image description here

我从客户端收到许多Excel文件。问题在于某些字段包含的文本大于255个字符-众所周知,Microsoft不够聪明,无法读取所有行(读取前8条记录并假设如果前8行少于255个,字符,则所有行必须小于255)。

当然,这会导致截断错误。即使我将SQL目标列的值设置为nvarchar(max),SSIS仍然会出错。正如我确定的那样,许多人仅使用SSMS并手动导入Excel文件都会产生此错误。对于我的SSIS包,我有一个数据转换任务,该任务应该将源数据转换为可以导入SQL Server的格式。显然不是。

这是我的简单数据流任务,突出显示了有问题的列:

enter image description here

因此,我在网上发现的有限解决方案建议对数据进行排序,以使最宽的文本值位于顶部,以便SQL Server可以读取它。我不能每次都处理数百个文件。而且我也需要按原始排序顺序提供数据,因此这不可行。或者,我应该在Excel文件的第一行插入一个虚拟记录。

在脚本任务中该怎么做?再次,可能超过数百个文件?我也听说我可以以某种方式更改注册表。我想惹那个吗?这些听起来有实用性吗?

我没有在网上看到任何可以与我的情况相提并论的东西-我感到困惑。这个怎么可能?我不是唯一遇到这些类型的截断问题的人。

无论如何,我感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

可能的解决方案:

1-通过更新TypeGuessRows的注册表项中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel来更改样本大小。路径在您的计算机中可能并不完全相同,但是会相似。

2-使用Flat File Connection Manager代替Excel Connection Manager,右键单击,转到“高级编辑器”,转到“输入和输出属性”选项卡,在“输出列”下的左侧找到您的列,并将其长度设置为1000

enter image description here

答案 1 :(得分:0)

由于我自己对SSMS无法对导入数据中的数据类型进行诊断而感到沮丧,因此我写了一个工具来完成这项工作。对我来说效果更好;如果您愿意使用Microsoft环境之外的脚本解决方案,则对您而言可能会更好。该工具是Python脚本,可从https://pypi.org/project/execsql/获得。 IMPORT命令将读取整个Excel或CSV文件以确定数据类型,几乎可以保证数据将成功导入。从CSV导入比从Excel导入要快 ,并且可以正确处理CSV文件列中的换行符。

答案 2 :(得分:0)

我在 Excel 工作表的第一行、所有列(或所有大尺寸列)中使用了公式 =rept("x",4000)。然后我粘贴了值。然后列映射正确地将该列解释为 nvarchar(max)。导入后,我删除了第一条记录。

虽然我使用了 4000,但它正确导入了远大于 4000 的单元格。不知何故,4000 足够大,可以选择“最大”作为字段大小。

(然后我测试了在字段大小的映射中输入“max”这个词是否会起作用。它接受这一点,并将输出创建为 nvarchar(max) 但仍然将输入截断为 255,因此有必要添加如上所述,这是第一条记录。有效。)