SSIS Excel导入强制不正确的列types

我试图使用SSIS将电子表格导入到我们的数据库。 出于某种原因,SSIS希望在包含字符数据时相信其中的两列是Doubletypes的。 我已经尝试重新映射列为nvarchar(255),但它仍然不想select它认为是双重的数据,因为它有字符。 如果我尝试编辑SSIS包并更改Excel Source中的列types,它将不会让我更改错误输出中的列的types,并且如果常规输出和错误输出列不会更改错误比赛。

为什么SSIS坚持这些列是双? 我怎么能强迫它意识到这些是string? 为什么从微软的一切都不能正常工作?

编辑:我发现这个: http : //support.microsoft.com/kb/236605

我sorting我的数据,以便混合的数据types将在顶部,并猜测是什么:问题逆转 。 它不是不导入字符数据,而是停止导入纯数字数据。 显然有人不认为12345可以表示为一个string…

我以前见过这个问题,这是Excel问题,而不是SSIS。 Excel对前几行进行采样,然后即使将其显式设置为文本,也会推断数据types。 你需要做的是把它放到SSIS包中的Excel文件连接string中。 这个指令告诉Excel列中包含混合的数据types,并提示它做额外的检查,然后再决定该列是一个数字types,而事实上并不是这样。

;Extended Properties="IMEX=1" 

它应该与此(在大多数情况下)。 要做的更安全的事情是将Excel数据导出到制表符分隔的文本并使用SSIS导入。

你可以转换(即强制)列数据为文本…试试这个(注意:这些说明是基于Excel 2007)…

以下步骤应强制Excel将该列作为文本处理:

使用Excel打开电子表格。

点击列标题,select包含“主要是数字数据”的整个列。

单击function区菜单上的数据选项卡。

select文本到列。 这将打开“将文本转换为列向导”。

在步骤1:单击下一步

– 在步骤2:单击下一步

在步骤3:select文本,然后单击完成

保存您的Excel工作表。

使用SQL Server 2005导入数据向导重试导入。

另外,下面是另一个问题的链接,其中有额外的答复:

导入数据向导不像我为列select的数据types

在接受的答案中没有提到的一件事是,“IMEX = 1”参数必须在引用部分:

 ...;Extended Properties="..."; 

; IMEX = 1; 并不总是正常工作…在Excel中混合数据types的一切: Excel列中的混合数据types

在这里输入图像说明

另一个解决方法是使用顶部的字符数据对电子表格进行sorting,从而导致Excel将字段视为string,并导入所有内容。

您也可以改变registry来查看比前8行更多的值。 我已经使用这种方法,工作得很好。

http://support.microsoft.com/kb/281517

那么IMEX = 1不适合我。 Reynier Booysen的build议也没有。 (我不知道它是否有所作为,但我使用SQL Server 2008r2)。 有关某些解决方法的一个很好的解释以及为什么IMEX = 1仅限于每个电子表格的前八行,可以在http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread / 78b87712-8ffe-4c72-914b-f1c031ba6c75

希望这可以帮助

我已经使用了下面的配方:

  1. 从Excel导入数据到Access
  2. 将数据从Access导入到SQL Server

它为我工作…

这个问题让我头撞墙。 在我们的环境中,我们以各种格式从我们的供应商那里获取价格文件,其中一些格式有上百万条logging。 这个问题通常发生在:

  • 由OLEDB驱动程序扫描的行似乎包含数字,但在logging集中或之后包含混合值
  • 字段确实只包含数字,但源代码有一些格式化为文本(通常是Excel文件)。

问题是,即使将外部input列设置为所需的数据types,也会在每次运行程序包时扫描文件,并dynamic更改为OLEDB驱动程序认为该字段应为的任何内容。

我们的源文件通常包含字段标题(文本)和价格(数字字段),这给了我一个简单的解决scheme:

第一步:

  • 更改您的SQL语句以包含标题字段。 这迫使SSIS将所有字段视为文本,包括价格字段。

对于混合领域:

  • 您最初的问题已经解决,因为您的字段现在是文本,但您的输出中仍然有一个标题行。
  • 通过更改SQL WHERE子句来排除标题值,例如“WHERE NOT([F4] ='Price')”,防止标题行进入输出

对于数字字段:

  • 使用OLE DB源的高级编辑器,将价格字段(或任何其他数字字段)的输出列设置为数字数据types。 这会导致包含这些字段中的文本的任何logging失败(包括标题logging),但强制将数字值转换为保存为文本。

  • 设置错误输出以忽略数字字段上的故障。

  • 或者,如果在redirect的数字字段上仍然需要任何错误,请通过更改SQL WHERE子句来排除标题值,然后删除标题行,

  • 设置错误输出以在该字段上redirect失败。

显然这种方法只适用于你有头字段,但希望这可以帮助你们中的一些人。

选项1.使用Visual Basic遍历每列,并将每列设置为文本格式。

使用“文本到列”菜单,不要更改删除,并将“常规”更改为“文本”

我有同样的问题。 该问题在Excel源任务。 当您第一次设置此任务时,任务将连接到指定的Excel文件(通过Excel连接),并根据当前电子表格确定每个列的types。

因此,如果您设置Excel源任务,只要确保应该是文本的列仅在列中具有文本。 这意味着Excel Source任务将始终假设任何后续的电子表格将具有相同的格式,并将12345作为文本读取,因为该列在设置任务时是文本。

希望这是有道理的!

我有同样的问题,单列中的多个数据types的值,包只加载数值。 保持所有更新为空。

为了解决这个问题,改变excel数据types是解决scheme之一。 在Excel中复制列数据并粘贴到不同的文件中。 删除该列 并将新列插入为文本数据types ,并将复制的数据粘贴到新列中。

现在在ssis包中删除并重新创buildExcel源和目标表,将列数据types更改为varchar

这将工作。

如果Excel电子表格中的多个列出现相同的名称,则会发生此类错误。 该包将在使列名不同之后工作。 有时在检查列名时忽略隐藏列。

  1. 单击function区菜单上的文件,然后单击选项。
  2. 单击高级,然后在计算此工作簿时,select设置显示精度checkbox,然后单击确定。

  3. 点击OK。

  4. 在工作表中,select要格式化的单元格。

  5. 在主页选项卡上,单击数字旁边的对话框启动器button图像。

  6. 在类别框中单击数字。

  7. 在“小数位数”框中,input要显示的小数位数。

这对我有效。 在Excel中select有问题的列 – 突出显示整个列。 将格式更改为“文本”。 保存Excel文件。

在您的SSIS包中,转到“数据stream”窗格进行导入。 双击Excel源节点。 它应该警告你,types已经改变,问你是否要重新映射它们。 单击是。 现在执行应该工作,并带来所有的价值。

注意:我正在使用Excel 2013和Visual Studio 2015,但我认为这些说明也适用于早期版本。