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 R2与SQL 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.

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

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

在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目标组件.



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





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

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

包执行成功.

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

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

这篇文章虽然不是解决方案.希望能帮助您找出问题在您的方案中的位置.
man*_*g18 20
我最终能够通过将平面文件连接中的列类型设置为"数据库日期[DT_DBDATE]"类型来解决该解决方案
显然,这些日期格式之间的差异如下:
DT_DATE包含年,月,日和小时的日期结构.
DT_DBDATE包含年,月和日的日期结构.
DT_DBTIMESTAMP一个时间戳结构,由年,月,小时,分钟,秒和分数组成
通过将列类型更改为DT_DBDATE,问题得以解决 - 我附加了一个数据查看器,CYCLE_DATE值现在只是"12/20/2010"而没有时间组件,这显然解决了问题.