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_DBDATEDT_DBTIME2类型)。我尝试将兼容性设置为130,然后设置为100,但“测试连接”失败。

https://docs.microsoft.com/en-us/sql/relational-databases/native-client/applications/using-connection-string-keywords-with-sql-server-native-client?view=sql-server-2017,有一个表格,指定有关此值的信息

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

怎样在SQL Server上部署SSIS包 2

如何将 SQL Server 2008 R2 SSIS 包升级到 SQL Server 2016?

SQL Server SSIS 参考资料

灵活运用SQL Server2008 SSIS变量

SSIS部署:SQL Server部署中的SSIS包运行时错误