我们将数据传输到平面文件中。我们要存储在名为DWValidFrom的目标列中的日期列具有以下格式:
2017-02-06T22:07:09Z
在使用平面文件连接管理器的SSIS中,我将所述列的数据类型设置为DT_DBTIMESTAMPOFFSET。在检查Connection Manager的“列”和“预览”页面中的数据时,它会正确显示我们。
在SQL Server中,我创建了目标表,并将DWValidFrom列定义为datetimeoffset(0):
[DWValidFrom] [datetimeoffset](0) NOT NULL,
当我尝试在已设置为相关SQL Server表的OLE DB Destination对象中设置映射时,SSIS将不会拥有该映射,并抛出以下错误:
The OLE DB provider used by the OLE DB adapter cannot convert between types "DT_DBTIMESTAMPOFFSET" and "DT_WSTR" for "DWValidFrom".
使用我的区域设置怀疑某些内容,我在Management Studio中发出以下查询以确保日期格式不会更改:
SELECT CAST('2017-02-06T22:07:09Z' AS datetimeoffset(0))
这产生了以下结果:
2017-02-06 22:07:09 +00:00
为什么SSIS无法识别列的正确数据类型?我没有设置任何其他转换或表达式,所以我很困惑为什么SSIS不允许我推送有效的datetimeoffset。
我们正在使用SQL Server 2014,Visual Studio 2015.
感谢。
答案 0 :(得分:1)
这听起来像OLEDB源元数据与您在平面文件连接管理器上所做的更改不同步。最快的方法是重新创建OLEDB源,但还没有完成。
SSIS不会喜欢该日期的标准ISO格式。如果你删除" T"在中间和" Z"最后还可以。即。
2017-02-06 22:07:09
由于SSIS中存在此转换问题,连接管理器可能无法将字符串转换为datetimeoffset。因此,您需要将其配置为字符串,然后在派生列中修复它的值:
(DT_DBTIMESTAMPOFFSET, 0) REPLACE(REPLACE( [DWValidFrom] , "T", " " ), "Z", "")
希望有所帮助, 米
答案 1 :(得分:1)
问题似乎是OLEDB目标不能将datetimeoffset识别为有效的列格式。尽管SQL Server和SSIS中的所有工作都推动了一个完全有效的日期时间,但OLEDB目的地将不具备任何功能。
我考虑使用SQL Server目标,但由于目标服务器与我们开发的服务器不同,因此也不是一个选项。
我们的修复方法是使用datetime格式化列作为数据类型,这会导致我们丢失时区信息,但由于所有日期都是UTC,我们真的不会错过任何数据。
答案 2 :(得分:0)
快速回答:将DataTypeCompatibility
设为0
我在Connection Manager
注意到我的SQL Server Native Client 11.0 (OLEDB)
连接,点击"全部",然后在SQLNCLI11.1部分下面有一个值DataTypeCompatibility
被设定为" 80"。 80是SQL Server 2000兼容性的代码,早在它们引入TimeStampOffset
之前(或者在我的情况下DT_DBDATE
和DT_DBTIME2
类型)。我尝试将兼容性设置为130,然后是100,但是"测试连接"失败。
DataTypeCompatibility SSPROP_INIT_DATATYPECOMPATIBILITY指定要使用的数据类型处理模式。认可的价值是" 0"对于提供者数据类型和" 80"对于SQL Server 2000数据类型。
将值更改为0,然后使用OLEDB连接管理器刷新所有连接似乎已经完成了诀窍 - 现在我的所有数据库类型都被识别,而不是强制它为nvarchar / DT_WSTR