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

man*_*g18 11 sql-server ssis etl sql-server-2008

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

我的目标列是类型为date(而不是datetime)的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]但没有用,因为它在管道中保持不变

小智 40

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

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

订单文件

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

CREATE TABLE [dbo].[Destination](
    [OrderNumber] [varchar](50) NULL,
    [OrderDate] [date] NULL
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

在SSIS包上,我创建了两个连接管理器.SQLServer是使用OLE DB连接创建的,用于连接SQL Server数据库.FlatFile是一个平面文件连接管理器.

连接

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

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

平面文件一般

"列"部分未进行任何更改.

平面文件列

将列名从Column0更改为OrderNumber.

高级列OrderNumber

将列名称从Column1OrderDate更改为并且还将数据类型更改为date [DT_DATE]

高级列OrderDate

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

数据预览

Control FlowSSIS包的选项卡上,放置一个Data Flow Task.

控制流

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

数据流任务

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

平面文件源连接管理器

平面文件源列

平面文件源错误输出

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

OLE DB目标连接管理器

OLE DB目标映射

OLE DB目标错误输出

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

右键点击

数据流路径编辑器新增功能

配置数据查看器

添加了数据流路径编辑器

数据查看器可见

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

空表

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

数据查看器暂停

包执行成功.

成功执行

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

表中的数据

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

目的地布局

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

  • 我很惊讶您没有创建注册帐户.或者为什么你的名字变灰了?精彩的回答.+1 (12认同)
  • 哦,谢谢你教我*数据查看器*.你刚从数百小时的工作中救了我. (4认同)

man*_*g18 20

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

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

DT_DATE包含年,月,日和小时的日期结构.

DT_DBDATE包含年,月和日的日期结构.

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

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