如何修复在平面文件中日期列出现“无效字符值用于转换规范”的问题?

21

我有一个CSV文件,每一行用{LF}分隔,其中包含一个日期列,日期格式为"12/20/2010"(包括引号)

我的目标列是一个SQL Server 2008数据库表,类型为日期(不是日期时间)

在我的Flat File Connection Manager中,我已将日期列配置为数据类型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 Destination Input”(773)上的输入列“CYCLE_DATE”(874)出现错误。返回的列状态为:“由于可能会丢失数据,无法转换该值。”。

如果我附加一个数据查看器,管道中的值为2010-12-20 00:00:00.0000000 - 这个时间组件是否是引起问题的原因?我尝试使用(DT_DATE)(DT_DBDATE)[CYCLE_DATE]去除时间组件,但不成功,因为在管道中它仍然保持不变。


2
@Siva - 在另一个问题上的回答很棒。 - JNK
3个回答

48
为了模拟您所遇到的问题,我使用SSIS 2008 R2SQL Server 2008 R2后端创建了以下示例。该示例基于我从您的问题中收集到的信息。该示例并未提供解决方案,但可能有助于您确定问题可能出在哪里。
创建一个简单的CSV文件,其中包含两列,即订单号和订单日期。如您在问题中提到的,两列的值都用双引号(")限定,并且每行以换行符(\n)结束,日期是最后一列。下面的屏幕截图是使用Notepad++拍摄的,它可以显示文件中的特殊字符。屏幕截图中的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

Flat file连接管理器被配置为读取CSV文件,以下是设置。红色箭头表示所做的更改。

为Flat file连接管理器提供名称。浏览到CSV文件的位置并选择文件路径。将双引号 (") 设为文本限定符。将Header行分隔符从 {CR}{LF} 更改为 {LF}。此Header行分隔符更改也反映在Columns部分。

Flat File General

在"Columns"部分没有进行任何更改。

Flat File Columns

将列名从Column0更改为OrderNumber

Advanced column OrderNumber

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

Advanced column OrderDate

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

Data Preview

在SSIS包的控制流程选项卡上,放置一个数据流任务

Control Flow

在数据流任务中放置了一个Flat File Source和一个OLE DB Destination

Data Flow Task

< p > Flat File Source被配置为使用FlatFile连接管理器读取CSV文件数据。以下三张截图展示了如何配置Flat File源组件。

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 Destination组件。

OLE DB Destination Connection Manager

OLE DB Destination Mappings

OLE DB Destination Error Output

使用以下5个截图中提到的步骤,在Flat File Source和OLE DB Destination之间的流程中添加了一个数据查看器。

Right click

Data Flow Path Editor New

Configure Data Viewer

Data Flow Path Editor Added

Data Viewer visible

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

Empty Table

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

Data Viewer Pause

软件包已成功执行。

Successful execution

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

Data in table

这是表dbo.Destination的布局。您可以看到,字段OrderDate是数据类型date,且包仍然能正确插入数据。

Destination layout

尽管这篇文章并不是一个解决方案,但希望能帮助您找出问题在您的情况下可能出现的地方。


16
我很惊讶您没有创建注册账户,或者为什么您的名字显示为灰色?非常好的回答,点赞+1。 - Mathias Lykkegaard Lorenzen
5
哦,还要感谢你教我关于“数据查看器”的知识。你刚刚节省了我数百个工作小时。 - Mathias Lykkegaard Lorenzen

23

最终我通过将平面文件连接中的列类型设置为"数据库日期[DT_DBDATE]"类型来解决了该问题。

显然,这些日期格式之间的差异如下:

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

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

DT_DBTIMESTAMP 一个由年、月、小时、分钟、秒和分数组成的时间戳结构。

通过将列类型更改为DT_DBDATE,问题得到了解决——我附加了一个数据查看器,CYCLE_DATE的值现在仅为"12/20/2010",没有时间部分,这似乎解决了问题。


+1 - 虽然这不是我的确切问题,但仍然非常有启发性。 - Mathias Lykkegaard Lorenzen

0

我在日期上有一个错误的值,即我运行了一个查询,针对于 2022-09-31 这个日期,但是这是不正确的,因为九月份不是31天的月份。将其更改为 2022-09-30 就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接