需要使用SSIS将Excel中的DATE列导入到SQL表

时间:2018-08-22 09:55:13

标签: ssis ssis-2008

我正在将 Microsoft Visual Studio 2010 Professional 集成服务一起使用。为了管理数据库,我使用的是 Microsoft SQL SERVER Management Studio 2012

我有一个带有几张纸的Excel文件。在某些工作表中,列DATE。 我需要将这些值导入到SQL表中。

我得到的问题是OLE DB源不断将excel的两个列CALLED' date '设置为DT_WSTR,长度为255,而不是DATE数据类型。我试图将其更改为外部列中EXCEL源输出下的数据类型为DATE,然后在日期列中...但是它始终将excel列设置为DT_WTSR,长度为255。 >

enter image description here

您可以在下面看到我正在使用的日期列的数据。

**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 (使用注册表编辑器)中将其设置为8(HEX)。我试图将其更改为0,甚至我给了它一个很长的数字,它不起作用。

我还更改了连接字符串,为 IMEX =?添加了几个假设(我尝试使用1、2和3,其中?是),但无济于事。如您所见,列日期中存在混合的数据类型...我需要保留这些值,如LAST示例中所示。如果我将带有日期的更多行移至第一行,则可以使用,但我们根本无法更改excel文件。那么,如何保持我在上一张表格中显示的值呢?谢谢!

重要:n / a值比日期多得多……这意味着即使我使用了很长的TYPEGUESSROWS SSIS也会使用文本... :(这必须是一种获取方法我想要的桌子!

2 个答案:

答案 0 :(得分:2)

从excel导入时,您可以将访问模式用作SQL命令,并将查询写为“ SELECT [cate(date)FROM [SHEET1 $] FROM date <>'n / a'” 在这里,您可以将“日期”更改为“日期列名称”,将“ Sheet1”更改为sheetName。 然后检查预览数据是否为日期格式。

请告知我进一步的问题

谢谢

Sasi

答案 1 :(得分:1)

Excel是不可靠的数据源。

首先,没有验证。任何人都可以在任何地方键入任何内容

第二,excel驱动程序在数据类型方面不一致。

我建议您导入所有varchar(或nvarchar)登台表,然后使用T-SQL清理它。

这里是一个例子:

DECLARE @StagingTable TABLE (ThisIsADate NVARCHAR(100))

INSERT INTO @StagingTable (ThisIsADate)
VALUES
('42527'),
('42290'),
('n/a'),
('42528'),
('41414'),
('n/a'),
('n/a'),
('17 Apr 2018')


SELECT 
CASE 
WHEN ThisIsADate = 'n/a' 
THEN NULL
WHEN TRY_CONVERT(INT,ThisIsADate) IS NOT NULL 
THEN CONVERT(DATETIME,DATEADD(d,CONVERT(INT,ThisIsADate)-1,'1900-01-01'))
ELSE TRY_CONVERT(DATETIME,ThisIsADate,113)
END Converted,
ThisIsADate
FROM @StagingTable

此示例尝试清除您在一个内联语句中标识的案例。这变得非常复杂并且容易出错。更好的方法是将目标转换字段放在登台表中并进行迭代:

DECLARE @StagingTable TABLE (
    ThisIsADate NVARCHAR(100), ConvertedDate DATETIME);

INSERT INTO @StagingTable (ThisIsADate)
VALUES
('42527'),
('42290'),
('n/a'),
('42528'),
('41414'),
('n/a'),
('n/a'),
('17 Apr 2018');


UPDATE @StagingTable
SET ConvertedDate = CONVERT(DATETIME,DATEADD(d,CONVERT(INT,ThisIsADate)-1,'1900-01-01'))
WHERE TRY_CONVERT(INT,ThisIsADate) IS NOT NULL;

UPDATE @StagingTable
SET ConvertedDate = TRY_CONVERT(DATETIME,ThisIsADate,113)
WHERE TRY_CONVERT(DATE,ThisIsADate,113) IS NOT NULL;


SELECT * FROM @StagingTable;

这似乎很复杂,但这是导入和清除excel数据的非常可靠的方法。不要走动IMEX和所有这些excel驱动程序设置。即使您找到了可行的组合并且可以将其部署到生产中,也无法解决最终用户可以在这些字段中键入任何内容的事实。