SSIS - SQL Server datetimeoffset(0)目标列,标识为DT_WSTR

时间:2017-02-07 16:27:53

标签: sql-server ssis

我们将数据传输到平面文件中。我们要存储在名为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.

感谢。

3 个答案:

答案 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_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"对于提供者数据类型和" 80"对于SQL Server 2000数据类型。

将值更改为0,然后使用OLEDB连接管理器刷新所有连接似乎已经完成了诀窍 - 现在我的所有数据库类型都被识别,而不是强制它为nvarchar / DT_WSTR