SSIS - SQL Server datetimeoffset目标列,标识为DT_WSTR
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSIS - SQL Server datetimeoffset目标列,标识为DT_WSTR相关的知识,希望对你有一定的参考价值。
我们将数据传输到平面文件中。我们要存储在名为DWValidFrom的目标列中的日期列具有以下格式:
2017-02-06T22:07:09Z
在使用平面文件连接管理器的SSIS中,我将所述列的数据类型设置为DT_DBTIMESTAMPOFFSET。在检查Connection Manager的“列”和“预览”页面中的数据时,它会正确显示。
在SQL Server中,我创建了目标表,并将DWValidFrom列定义为datetimeoffset(0):
[DWValidFrom] [datetimeoffset](0) NOT NULL,
当我尝试在OLE DB目标对象中设置映射时,该对象已设置为相关的SQL Server表,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。
谢谢。
这听起来像OLEDB源元数据与您在平面文件连接管理器上所做的更改不同步。最快的修复方法是重新创建OLEDB源,但还没有那样做。
SSIS不会喜欢该日期的标准ISO格式。如果你删除中间的“T”和结尾的“Z”就可以了。即
2017-02-06 22:07:09
由于SSIS中的此转换问题,连接管理器可能无法将字符串转换为datetimeoffset。因此,您需要将其配置为字符串,然后在派生列中修复它的值:
(DT_DBTIMESTAMPOFFSET, 0) REPLACE(REPLACE( [DWValidFrom] , "T", " " ), "Z", "")
希望有所帮助,m
问题似乎是OLEDB目的地不将datetimeoffset识别为有效的列格式。尽管SQL Server和SSIS中的所有工作都推动了一个完全有效的日期时间,但OLEDB目的地将不会有任何一个。
我考虑使用SQL Server目标,但由于目标服务器与我们开发的服务器不同,因此也不是一种选择。
我们的修复方法是使用datetime格式化列作为数据类型,这会导致我们丢失时区信息,但由于所有日期都是UTC,我们实际上不会遗漏任何数据。
快速解答:将DataTypeCompatibility
设置为0
我在Connection Manager
中注意到我的SQL Server Native Client 11.0 (OLEDB)
连接,单击“All”,然后在SQLNCLI11.1部分下面有一个值为DataTypeCompatibility
,设置为“80”。 80是SQL Server 2000兼容性的代码,远在它们引入TimeStampOffset
之前(或者在我的情况下引入DT_DBDATE
和DT_DBTIME2
类型)。我尝试将兼容性设置为130,然后设置为100,但“测试连接”失败。
DataTypeCompatibility SSPROP_INIT_DATATYPECOMPATIBILITY指定要使用的数据类型处理模式。提供者数据类型的识别值为“0”,SQL Server 2000数据类型的识别值为“80”。
将值更改为0,然后使用OLEDB连接管理器刷新所有连接似乎已经完成了 - 现在我的所有数据库类型都被识别,而不是强制它到nvarchar / DT_WSTR
以上是关于SSIS - SQL Server datetimeoffset目标列,标识为DT_WSTR的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 中将值分配给类似列后,使用 SSIS 将 Oracle 表列更新为 Null