我很遗憾发布一个看似非常简单的问题,但我找不到答案,而且我在浪费时间(此时不仅仅是几个小时)。我是SSIS的新手,它只是踢我的背后。
背景
非常简单的SSIS包,用于将Excel工作表导入SQL Server中的Staging表。由于我不想通过使用错误的命名法误导任何人,我将Excel源代码称为Excel,将SQL Server表称为目标表。
这个包以前有过工作。但是,由于日期列的数据截断,它现在失败了。 Excel列已格式化为DATE(我在DATE中尝试了一些不同的格式选项)。目标列也是DATE列(非日期时间)。 Excel中的数据主要是空单元格,具有一些零星值。我认为错误在日期开始出现在数据中时开始(而不仅仅是空白)。
我尝试过双面使用高级编辑器(Excel& Target)并尝试了大量的数据类型设置,但我仍然遇到同样的失败。我怀疑它现在已经搞砸了我所做的各种测试。
我还尝试为日期字段“date [DT_DATE]”添加数据转换变换 - 这不起作用。 AND,我尝试创建派生列 - 首先基于Excel列,然后是转换列。所有这些尝试都失败了。
问题:
1)将Excel数据导入SQL Server for DATE列的最佳做法是什么?
2)由于这是两个非常成熟的Microsoft Apps(Excel和SQL Server)协同工作,看起来应该很简单。这让我相信我必须在这里遗漏一些基本概念。谁能让我直截了当?
3)你们如何在SQL Server中获得Excel日期?
4)进行编辑后同步列的技巧是什么?
感谢您提供的任何见解。很抱歉打扰你们看起来非常简单。
大卫
答案 0 :(得分:1)
就我个人而言,我认为excel约会没有最佳实践,这对我来说总是很痛苦。
如果您可以格式化Excel文件,请尝试将其更改为'文字'。它将导入为Unicode而不是日期。如果没有,请尝试转换"数据转换中的列 "任务到Unicode
完成后,您需要使用"派生列"任务。以您想要的格式构建日期。
来源MM/dd/yyyy hh:mm:ss
构建为yyyy-MM-dd
SUBSTRING(datecolumn,7,4)+ "-" + SUBSTRING(datecolumn,1,2)+ "-" +SUBSTRING(datecolumn,4,2)
可能是粗暴的,但可以节省我的理智。
如果日期看起来像m/d/yyyy
时不包括Jan或者其他内容的2个值,那么您将为月份部分添加一些类似的内容。
RIGHT("0" + SUBSTRING(datecolumn,1,FINDSTRING(datecolumn,"/"1)-1),2)
祝你好运
答案 1 :(得分:1)
从excel工作表导入数据时的主要问题是excel是excel中的每一列都可以有多种数据类型或格式,因此同一列可以包含日期和数字以及带有不同格式的文本或日期(某些格式不能是隐式转换为SSIS中的日期。)
如果所有日期值都存储为日期(而不是文本),则从Excel工作表中导入日期的最佳做法是将DATE
转换为数字格式"0.000000000"
(在excel中,它是从excel调用 Serial DateTime )或使用像Microsoft.Office.Interop.Excel
您可以参考此Link,但请使用以下内容:
xlCells.NumberFormat = "0.0000000"
然后在SSIS包中使用脚本组件使用DateTime.FromOADate()函数
将其再次转换为Date *假设inColumn
是具有数字类型的Date列,请添加类型为outColumn
或DT_DBTIMESTAMP
的输出列DT_DATE
,并使用以下代码:
If Not Row.inColumn_IsNull Then
Row.OutColumn = DateTime.FromOADate(CDbl(Row.inColumn))
Else
Row.OutColumn_IsNull = True
End If
注意:将列转换为数字格式时,您忽略了所有格式但仍具有日期值
要了解有关Excel中DateTimes的更多信息,请参阅此Link
要详细了解可在SSIS中隐式转换为日期的日期时间格式,请按照SSIS Source Format Implicit Conversion for Datetime