【问题标题】:How do I fix 'Invalid character value for cast specification' on a date column in flat file?如何修复平面文件中日期列上的“强制转换规范的无效字符值”?
【发布时间】:2011-09-02 19:42:58
【问题描述】:

我有一个 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 记录可用。来源:“Microsoft OLE DB Provider for SQL Server”Hresult:0x80004005 描述:“转换规范的字符值无效。”。 [TRN_DORPS [760]] 错误:输入“OLE DB 目标输入”(773) 上的输入列“CYCLE_DATE”(874) 存在错误。返回的列状态为:“由于可能丢失数据,无法转换该值。”。

如果我附加一个数据查看器,管道中的值是 2010-12-20 00:00:00.0000000 - 这个时间组件是导致问题的原因吗?我尝试使用(DT_DATE)(DT_DBDATE)[CYCLE_DATE] 去除时间组件,但无济于事,因为它在管道中保持不变

【问题讨论】:

  • @Siva - 另一个问题的好答案

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


【解决方案1】:

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

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

在 SQL Server 数据库中创建了一个名为 dbo.Destination 的简单表,以使用 SSIS 包填充 CSV 文件数据。下面给出了表的创建脚本。

CREATE TABLE [dbo].[Destination](
    [OrderNumber] [varchar](50) NULL,
    [OrderDate] [date] NULL
) ON [PRIMARY]
GO

在 SSIS 包上,我创建了两个连接管理器。 SQLServer 是使用 OLE DB 连接创建的,以连接到 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 组件已配置为接受来自平面文件源的数据并将其插入名为 dbo.Destination 的 SQL Server 数据库表中。下面的三个屏幕截图显示了 OLE DB 目标组件的配置方式。

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

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

执行了包,包执行暂时暂停,以在数据查看器中显示从平面文件源流向 OLE DB 目标的数据。我点击了运行按钮继续执行。

包执行成功。

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

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

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

【讨论】:

  • 我很惊讶您没有创建注册帐户。或者为什么你的名字是灰色的?精彩的答案。 +1
  • 哦,感谢您教我有关数据查看器的知识。您刚刚使我免于数百小时的工作。
【解决方案2】:

我最终能够通过将平面文件连接中的列类型设置为“数据库日期 [DT_DBDATE]”类型来解决该解决方案

显然这些日期格式之间的区别如下:

DT_DATE 由年、月、日、和小时组成的日期结构。

DT_DBDATE 由年、月、日组成的日期结构。

DT_DBTIMESTAMP 由年、月、时、分、秒、分数组成的时间戳结构

通过将列类型更改为 DT_DBDATE,问题得到了解决 - 我附加了一个数据查看器,而 CYCLE_DATE 值现在只是“12/20/2010”,没有时间组件,这显然解决了问题。

【讨论】:

  • +1 - 虽然这不是我的确切问题,但它仍然非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多