电子表格:
输入文件包含如下所示的数据。
Column
------
123456
234567
ADCDEF
CSV/文本:
输出文件包含如下所示的数据
Column
------
123456
234567
NULL
为什么SSIS包在传输数据时在最后一行写入NULL值而不是ABCDEF?Excel
CSV
问题是 Excel 文件包含数值和字符串的混合数据,这导致 Excel 读取前几行并将列的数据类型推断为数值,在这种情况下不正确。当您创建一个Excel 数据源来读取此 Excel 文件时,您会注意到该列被定义为数字并以这种方式处理它。因此,字符串永远不会进入输出文件。
您需要修改 Excel 连接管理器的 ConnectionString 属性以包含IMEX=1
以指示数据源可能包含不同数据类型的值。
IMEX
代表在intermixed
这里阅读更多信息:Excel的连接字符串
这里有一个例子来说明差异。
我根据问题中提供的数据创建了两个相同的 Excel 文件。
使用以下连接管理器创建了一个 SSIS 包。
Excel_1具有以下连接字符串
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_1.xls;Extended Properties="Excel 8.0;HDR=YES";
Excel_2具有以下连接字符串。不同之处在于额外的 IMEX=1;。您需要手动将此添加到 Excel 连接管理器的 ConnectionString 属性。要查看属性,请单击Excel 连接管理器并按F4。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_2.xls;Extended Properties="EXCEL 8.0;IMEX=1;HDR=YES";
设计了如下所示的数据流传输Excel_1.xls
到FlatFile_1.csv
和Excel_2.xls
到FlatFile_2.csv
您可以在输出中看到第一个平面文件的第三行没有任何值,但第二个文件有。原因是第一个 Excel 连接管理器推断列类型为数值,这是不正确的。但是,第二个文件处理了
您可以右键单击Excel 数据源,然后单击Show Advanced Editor...
在高级编辑器上,单击Input and Output Properties
,展开 Excel 源输出,然后展开External Columns
。单击Column
。
您会注意到第一个 Excel 数据源上的列的数据类型在第double-precision float [DT_R8]
一个 Excel 连接管理器上设置为Excel_1
您会注意到第二个 Excel 数据源上的列的数据类型Unicode string [DT_WSTR]
在第一个 Excel 连接管理器上设置为Excel_2
希望有帮助。