【发布时间】:2018-08-22 09:55:13
【问题描述】:
我正在使用 Microsoft Visual Studio 2010 Professional 和 集成服务。对于数据库的管理,我使用 Microsoft SQL SERVER Management Studio 2012。
我有一个包含几张工作表的 excel 文件。在某些工作表中,有一列 DATE。 我需要将这些值导入 SQL 表。
我遇到的问题是 OLE DB 源不断将几个 excel 列 CALLED 'date' 设置为 DT_WSTR,长度为 255,而不是 DATE 数据类型。我尝试将其更改为 DATE 作为外部列中 EXCEL 源输出下的数据类型,然后在日期列中...但它始终将 excel 列设置为 DT_WTSR 并具有 255(长度)...
您可以在下面看到我正在使用的日期列的数据。
**DATE**
06/jun/16
13/oct/15
n/a
07/jun/16
20/may/13
n/a
n/a
n/a
n/a
n/a
17 Apr 2018
我在 SQL 表中得到了什么:
**DATE**
42527
42290
n/a
42528
41414
n/a
n/a
n/a
n/a
n/a
17 Apr 2018
想要什么?
**DATE**
06/06/2016
10/13/2015
n/a
06/07/2016
05/20/2013
n/a
n/a
n/a
n/a
n/a
04/17/2018
在 TYPEGUESSROWS(使用 regedit)中设置为 8(十六进制)。我已经尝试将其更改为 0,甚至我给了它一个很长的数字,但它不起作用。
我还更改了连接字符串,为 IMEX=? 添加了几个假设(我尝试过 1、2 和 3 where is ?)但无济于事。如您所见,日期列中有混合数据类型......我需要保留这些值,因为它出现在 LAST 示例中。如果我将更多带日期的行移到第一行,它可以工作,但我们根本无法更改 excel 文件。那么我们如何才能保持我展示的最后一个表格中的值呢?谢谢!
重要:n/a 值比日期多得多...这意味着即使我使用很长的 TYPEGUESSROWS SSIS 也会使用文本... :( 它必须是一种获取方式我想要的桌子!
【问题讨论】:
-
n/a 不是日期,其他日期格式不一致,因此选择了相应的数据类型。这里常用的方法是加载到一个暂存表(其中包含所有 varchar 字段),然后使用 T-SQL 清理它并合并到目标表中。
-
您是说我们需要使用 T-SQL 将 42527 转换为正确的日期 06/06/2016?我正在使用临时表,是的。暂存表的负载显示此值:42527 而不是 06/06/2016。所以我需要获取这些值并使用 T-SQL 进行转换,然后将其移动到新表(转换后的值)。
-
是的。 Excel 数据类型不够可靠,显然 Excel 表中的实际数据不够可靠。您需要对至少三种情况执行清理过程:1. N/A 2. 数字(加到 1/1/1900 并取 1) 3. 看起来像日期的字符串(使用 TRY_CAST)