需要使用SSIS将excel中的日期列导入SQL表

需要使用SSIS将excel中的日期列导入SQL表,ssis,ssis-2008,Ssis,Ssis 2008,我正在使用Microsoft Visual Studio 2010 Professional和集成服务。对于数据库的管理,我使用的是Microsoft SQL SERVER management Studio 2012 我有一个excel文件和几张表格。在一些表格中有一列日期。 我需要将这些值导入SQL表 我遇到的问题是,OLE DB源代码一直在为DT_WSTR设置两个名为“date”的excel列,其长度为255,而不是日期数据类型。我尝试在EXCEL源输出的外部列中将其更改为DATE作为数据

我正在使用Microsoft Visual Studio 2010 Professional和集成服务。对于数据库的管理,我使用的是Microsoft SQL SERVER management Studio 2012

我有一个excel文件和几张表格。在一些表格中有一列日期。 我需要将这些值导入SQL表

我遇到的问题是,OLE DB源代码一直在为DT_WSTR设置两个名为“date”的excel列,其长度为255,而不是日期数据类型。我尝试在EXCEL源输出的外部列中将其更改为DATE作为数据类型,然后在DATE列中。。。但它保持将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?),但没有成功。如您所见,date列中存在混合数据类型。。。我需要保持这些值与上一个示例中显示的一样。如果我将更多带有日期的行移到第一行,它会工作,但我们根本无法更改excel文件。那么,我们如何保持上一张表中显示的值呢?谢谢


重要:不适用的值比日期多得多。。。这意味着即使我使用很长的字体,SSIS也会使用文本…:(这必须是一种获取我想要的表的方法!

从excel导入时,您可以使用Access模式作为SQL命令,并将查询写入“从[SHEET1$]中选择cdate(date),其中date'n/a'” 在这里,您可以将“日期”更改为“日期列名”,将“Sheet1”更改为您的sheetName。 然后检查预览,数据以日期格式出现

请让我知道还有什么问题

谢谢


Sasi

从excel导入时,您可以使用Access模式作为SQL命令,并将查询写为“从[SHEET1$]中选择cdate(日期),其中日期‘n/a’” 在这里,您可以将“日期”更改为“日期列名”,将“Sheet1”更改为您的sheetName。 然后检查预览,数据以日期格式出现

请让我知道还有什么问题

谢谢


Sasi是一个不可靠的数据源

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

其次,excel驱动程序与数据类型不一致

我建议您导入一个all 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驱动程序设置。即使你找到了一种可以工作并可以部署到生产中的组合,它也不能解决最终用户可以在这些字段中键入任何内容的问题。

n不可靠的数据源

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

其次,excel驱动程序与数据类型不一致

我建议您导入一个all 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驱动程序设置。即使你找到了一种可以工作并可以部署到生产中的组合,它也不能解决最终用户可以在这些字段中键入任何内容的问题。

n/a不是一个问题日期,而其他日期的格式不一致,因此会相应地选择数据类型然后使用T-SQL将其清理并合并到目标表中。您是说我们需要使用T-SQL将42527转换为2016年6月6日的正确日期吗?我使用的是暂存表。暂存表的负载显示此值:42527,而不是2016年6月6日。因此,我需要提取这些值并使用T-SQL进行转换,然后将其移动到new表(转换后的值)。是的。Excel数据类型不够可靠,而且Excel工作表中的实际数据显然不够可靠。您至少需要在三种情况下执行s清理过程:1.N/A 2.数字(添加到1/1/1900并取1)3.看起来像日期的字符串(使用TRY\u CAST)n/a不是日期,其他日期的格式不一致,因此会相应地选择数据类型然后使用T-SQL将其清理并合并到目标表中。您是说我们需要使用T-SQL将42527转换为2016年6月6日的正确日期吗?我使用的是暂存表。暂存表的负载显示此值:42527,而不是2016年6月6日。因此,我需要提取这些值并使用T-SQL进行转换,然后将其移动到new表(转换后的值)。是的。Excel数据类型不够可靠,而且Excel工作表中的实际数据显然不够可靠。您需要至少在三种情况下执行s清理过程:1.N/A 2.数字(添加到1/1/1900并取1)3.看起来像日期的字符串(使用TRY\u CAST)where子句将限制数据集