1

电子表格:

输入文件包含如下所示的数据。

Column
------
123456
234567
ADCDEF

CSV/文本:

输出文件包含如下所示的数据

Column
------
123456
234567
NULL

为什么SSIS包在传输数据时在最后一行写入NULL值而不是ABCDEFExcelCSV

4

1 回答 1

3

问题是 Excel 文件包含数值和字符串的混合数据,这导致 Excel 读取前几行并将列的数据类型推断为数值,在这种情况下不正确。当您创建一个Excel 数据源来读取此 Excel 文件时,您会注意到该列被定义为数字并以这种方式处理它。因此,字符串永远不会进入输出文件。

您需要修改 Excel 连接管理器的 ConnectionString 属性以包含IMEX=1以指示数据源可能包含不同数据类型的值。

IMEX代表在intermixed这里阅读更多信息:Excel的连接字符串

这里有一个例子来说明差异。

我根据问题中提供的数据创建了两个相同的 Excel 文件。

Excel_1

Excel_2

使用以下连接管理器创建了一个 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.xlsFlatFile_1.csvExcel_2.xlsFlatFile_2.csv

包裹

您可以在输出中看到第一个平面文件的第三行没有任何值,但第二个文件有。原因是第一个 Excel 连接管理器推断列类型为数值,这是不正确的。但是,第二个文件处理了

平面文件_1

平面文件_2

您可以右键单击Excel 数据源,然后单击Show Advanced Editor...

Excel 数据源

在高级编辑器上,单击Input and Output Properties,展开 Excel 源输出,然后展开External Columns。单击Column

您会注意到第一个 Excel 数据源上的列的数据类型在第double-precision float [DT_R8]一个 Excel 连接管理器上设置为Excel_1

Excel_1 高级

您会注意到第二个 Excel 数据源上的列的数据类型Unicode string [DT_WSTR]在第一个 Excel 连接管理器上设置为Excel_2

Excel_2 高级

希望有帮助。

于 2013-01-30T14:02:38.010 回答