需要使用 SSIS 将 excel 中的 DATE 列导入到 SQL table

Need to import a DATE column in excel to a SQL table using SSIS

我正在使用 Microsoft Visual Studio 2010 Professional WITH Integration Services。对于数据库的管理,我使用 Microsoft SQL SERVER Management Studio 2012

我有一个包含几张纸的 excel 文件。在某些工作表中有一列 DATE。 我需要将这些值导入 SQL table。

我遇到的问题是 OLE DB 源不断将 CALLED 'date' 中的几个 excel 列设置为 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 Table 中得到了什么:

**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,哪里是?)但无济于事。如您所见,日期列中存在混合数据类型...我需要保留这些值,因为它出现在最后一个示例中。如果我将更多带有日期的行移动到第一行,它会起作用,但我们根本无法更改 excel 文件。那么我们如何才能保持我上次展示的 table 中显示的值呢?谢谢!

重要:值 n/a 比日期多得多...这意味着即使我使用很长的 TYPEGUESSROWS SSIS 也会使用文本...:(这一定是获得我想要的 table 的方法!

从 excel 导入时,您可以使用访问模式作为 SQL 命令并将查询编写为 "SELECT cdate(date) FROM [SHEET1$] where date<>'n/a'" 在这里您可以将 "date" 更改为您的 "Date column name" 并将 "Sheet1" 更改为您的工作表名称。 然后检查预览数据是否为日期格式。

还有什么问题请告诉我

谢谢

萨西

Excel 是一个不可靠的数据源。

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

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

我建议您导入一个全 varchar(或 nvarchar)暂存区 table 然后使用 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

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

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 驱动程序设置的道路。即使您找到了一个有效的组合并且可以部署到生产中,它也没有解决最终用户可以在这些字段中键入任何内容的事实。