我有一个CSV文件,其中{LF}分隔每一行,日期列的日期格式为"12/20/2010"
(包括引号)
我的目标列是日期(不是日期时间)
的SQL Server 2008数据库表在我的平面文件连接管理器中,我已将日期列配置为数据类型 date [DT_DATE]
,其中TextQualified设置为true,列分隔符为 {LF}
(这是每行的最后一列)。我将文字限定符设置为 "
当我尝试将其加载到OLE目标时,我收到以下错误
[TRN_DORPS [760]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80004005。 OLE DB记录可用。源:“用于SQL Server的Microsoft OLE DB提供程序”Hresult:0x80004005描述:“转换规范的字符值无效。”。 [TRN_DORPS [760]]错误:输入“OLE DB目标输入”(773)上的输入列“”CYCLE_DATE“”(874)出错。返回的列状态为:“由于可能丢失数据,无法转换该值。”。
如果我附加数据查看器,管道中的值是 2010-12-20 00:00:00.0000000
- 这个时间组件是什么导致了问题?我尝试用(DT_DATE)(DT_DBDATE)[CYCLE_DATE]
删除时间组件但无效,因为它在管道中保持不变
答案 0 :(得分:40)
为了模拟您面临的问题,我使用带有SSIS 2008 R2
后端的SQL Server 2008 R2
创建了以下示例。该示例基于我从您的问题中收集的内容。此示例不提供解决方案,但它可以帮助您确定问题的位置。
创建了一个简单的CSV文件,其中包含两个列,即订单号和订单日期。正如您在问题中提到的那样,两列的值都使用双引号(“)进行限定,并且行以换行符(\ n)结束,日期为最后一列。下面的屏幕截图是使用{{3可以显示文件中的特殊字符。截图中的LF表示换行。
在SQL Server数据库中创建一个名为dbo.Destination
的简单表,以使用SSIS包填充CSV文件数据。下面给出了为表创建脚本的方法。
CREATE TABLE [dbo].[Destination](
[OrderNumber] [varchar](50) NULL,
[OrderDate] [date] NULL
) ON [PRIMARY]
GO
在SSIS包上,我创建了两个连接管理器。使用OLE DB连接创建 SQLServer 以连接到SQL Server数据库。 FlatFile 是一个平面文件连接管理器。
平面文件连接管理器配置为读取CSV文件,设置如下所示。红色箭头表示所做的更改。
为平面文件连接管理器提供了一个名称。浏览到CSV文件的位置并选择文件路径。输入双引号("
)作为文本限定符。将标题行分隔符从{CR} {LF}更改为{LF}
。此标题行分隔符更改也反映在“列”部分。
“列”部分未进行任何更改。
将列名称从 Column0 更改为OrderNumber
。
将列名称从 Column1 更改为OrderDate
,并将数据类型更改为date [DT_DATE]
平面文件连接管理器中的数据预览看起来不错。
在SSIS包的Control Flow
标签上,放置了Data Flow Task
。
在数据流任务中,放置了Flat File Source
和OLE DB Destination
。
Flat File Source
配置为使用FlatFile连接管理器读取CSV文件数据。以下三个屏幕截图显示了如何配置平面文件源组件。
OLE DB Destination
组件配置为接受来自Flat File Source的数据,并将其插入名为dbo.Destination
的SQL Server数据库表中。以下三个屏幕截图显示了如何配置OLE DB目标组件。
使用以下5个屏幕截图中提到的步骤,我在平面文件源和OLE DB目标之间的流程上添加了一个数据查看器。
在运行包之前,我验证了表中的初始数据。它目前是空的,因为我是使用本文开头提供的脚本创建的。
执行包并临时暂停包执行,以在数据查看器中显示从Flat File Source流向OLE DB Destination的数据。我点击了运行按钮继续执行。
包已成功执行。
平面文件源数据已成功插入表dbo.Destination
。
这是表dbo.Destination的布局。如您所见,字段 OrderDate 的数据类型为日期,并且包仍然继续正确插入数据。
这篇文章虽然不是解决方案。希望能帮助您找出问题在您的方案中的位置。
答案 1 :(得分:20)
我最终能够通过将平面文件连接中的列类型设置为“数据库日期[DT_DBDATE]”
类型来解决该解决方案显然,这些日期格式之间的差异如下:
DT_DATE 日期结构,包括年,月,日,和小时。
DT_DBDATE 由年,月和日组成的日期结构。
DT_DBTIMESTAMP 时间戳结构,包括年,月,小时,分钟,秒和分数
通过将列类型更改为DT_DBDATE,问题已解决 - 我附加了一个数据查看器,CYCLE_DATE值现在只是“12/20/2010”而没有时间组件,这显然解决了问题。
答案 2 :(得分:0)
“2010-12-20 00:00:00.0000000”值的正确数据类型为DATETIME2(7) / DT_DBTIME2()。
但是CYCLE_DATE字段使用的数据类型是DATETIME - DT_DATE。这意味着毫秒精度,精度低至每三分之一毫秒(yyyy-mm-ddThh:mi:ss.mmL,其中L可以是0.3或7)。
解决方案是将CYCLE_DATE日期类型更改为DATETIME2 - DT_DBTIME2。