如何在平面文件中的日期列中修复“强制转换规范的无效字符值”?

时间:2011-09-02 19:42:59

标签: sql-server sql-server-2008 etl ssis

我有一个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]删除时间组件但无效,因为它在管道中保持不变

3 个答案:

答案 0 :(得分:40)

为了模拟您面临的问题,我使用带有SSIS 2008 R2后端的SQL Server 2008 R2创建了以下示例。该示例基于我从您的问题中收集的内容。此示例不提供解决方案,但它可以帮助您确定问题的位置。

创建了一个简单的CSV文件,其中包含两个列,即订单号和订单日期。正如您在问题中提到的那样,两列的值都使用双引号(“)进行限定,并且行以换行符(\ n)结束,日期为最后一列。下面的屏幕截图是使用{{3可以显示文件中的特殊字符。截图中的LF表示换行。

Orders file

在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 是一个平面文件连接管理器。

Connections

平面文件连接管理器配置为读取CSV文件,设置如下所示。红色箭头表示所做的更改。

为平面文件连接管理器提供了一个名称。浏览到CSV文件的位置并选择文件路径。输入双引号(")作为文本限定符。将标题行分隔符从{CR} {LF}更改为{LF}。此标题行分隔符更改也反映在“列”部分。

Flat File General

“列”部分未进行任何更改。

Flat File Columns

将列名称从 Column0 更改为OrderNumber

Advanced column OrderNumber

将列名称从 Column1 更改为OrderDate,并将数据类型更改为date [DT_DATE]

Advanced column OrderDate

平面文件连接管理器中的数据预览看起来不错。

Data Preview

在SSIS包的Control Flow标签上,放置了Data Flow Task

Control Flow

在数据流任务中,放置了Flat File SourceOLE DB Destination

Data Flow Task

Flat File Source配置为使用FlatFile连接管理器读取CSV文件数据。以下三个屏幕截图显示了如何配置平面文件源组件。

Flat File Source Connection Manager

Flat File Source Columns

Flat File Source Error Output

OLE DB Destination组件配置为接受来自Flat File Source的数据,并将其插入名为dbo.Destination的SQL Server数据库表中。以下三个屏幕截图显示了如何配置OLE DB目标组件。

OLE DB Destination Connection Manager

OLE DB Destination Mappings

OLE DB Destination Error Output

使用以下5个屏幕截图中提到的步骤,我在平面文件源和OLE DB目标之间的流程上添加了一个数据查看器。

Right click

Data Flow Path Editor New

Configure Data Viewer

Data Flow Path Editor Added

Data Viewer visible

在运行包之前,我验证了表中的初始数据。它目前是空的,因为我是使用本文开头提供的脚本创建的。

Empty Table

执行包并临时暂停包执行,以在数据查看器中显示从Flat File Source流向OLE DB Destination的数据。我点击了运行按钮继续执行。

Data Viewer Pause

包已成功执行。

Successful execution

平面文件源数据已成功插入表dbo.Destination

Data in table

这是表dbo.Destination的布局。如您所见,字段 OrderDate 的数据类型为日期,并且包仍然继续正确插入数据。

Destination layout

这篇文章虽然不是解决方案。希望能帮助您找出问题在您的方案中的位置。

答案 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。