Sql server 在SQL Server中将DT_DBTIMESTAMP2类型的列映射到datetime2时,发生转换规范的无效字符值错误

Sql server 在SQL Server中将DT_DBTIMESTAMP2类型的列映射到datetime2时,发生转换规范的无效字符值错误,sql-server,datetime,ssis,visual-studio-2017,etl,Sql Server,Datetime,Ssis,Visual Studio 2017,Etl,我正在创建一个SSIS包,以便将CSV文件导入到表中。目前,我正在导入一个平面文件,创建一个派生列,执行数据转换,然后将其加载到数据库中 包数据流 我遇到的问题是,在尝试将类型为DT_DBTIMESTAMP2的列转换为datetime2时,它抛出以下错误: [OLE DB Destination[78]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80004005。 OLE DB记录可用。来源:“Microsoft OLE DB Provider

我正在创建一个SSIS包,以便将CSV文件导入到表中。目前,我正在导入一个平面文件,创建一个派生列,执行数据转换,然后将其加载到数据库中

包数据流

我遇到的问题是,在尝试将类型为
DT_DBTIMESTAMP2
的列转换为
datetime2
时,它抛出以下错误:

[OLE DB Destination[78]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80004005。
OLE DB记录可用。来源:“Microsoft OLE DB Provider for SQL Server”Hresult:0x80004005说明:“转换规范的字符值无效。”。
OLE DB记录可用。来源:“Microsoft OLE DB Provider for SQL Server”Hresult:0x80004005说明:“转换规范的字符值无效。”

“我的数据”的格式为:

20-NOV-18 06.09.43.928460000 PM
在我的派生列中,我使用以下表达式,该表达式似乎给出了我要查找的结果:

"20" + SUBSTRING(DSTAMP,8,2) + "-" + 
    (SUBSTRING(DSTAMP,4,3) == "JAN" ? "01" : 
     SUBSTRING(DSTAMP,4,3) == "FEB" ? "02" : 
     SUBSTRING(DSTAMP,4,3) == "MAR" ? "03" : 
     SUBSTRING(DSTAMP,4,3) == "APR" ? "04" : 
     SUBSTRING(DSTAMP,4,3) == "MAY" ? "05" : 
     SUBSTRING(DSTAMP,4,3) == "JUN" ? "06" : 
     SUBSTRING(DSTAMP,4,3) == "JUL" ? "07" : 
     SUBSTRING(DSTAMP,4,3) == "AUG" ? "08" : 
     SUBSTRING(DSTAMP,4,3) == "SEP" ? "09" : 
     SUBSTRING(DSTAMP,4,3) == "OCT" ? "10" : 
     SUBSTRING(DSTAMP,4,3) == "NOV" ? "11" : 
     SUBSTRING(DSTAMP,4,3) == "DEC" ? "12" : " ") 
+ "-" + LEFT(DSTAMP,2) + " " + SUBSTRING(DSTAMP,11,2) + ":" +
SUBSTRING(DSTAMP,14,2) + ":" + SUBSTRING(DSTAMP,17,2) + "." +
SUBSTRING(DSTAMP,20,7)
我设置了一个data viewer,它似乎给了我想要的结果:

数据查看器输出

我已经浏览了很多帖子,寻找答案,但没有找到一个适合我的情况。在失败之前,包正在通过OLE DB目标

我已经清理了输入文件以查找异常,所有行都是正确的

我想另一双眼睛可能会有所帮助,任何建议都将不胜感激

尝试在派生列内强制转换为(DT_db2):

(BT_DBTIMESTAMP2)("20" + SUBSTRING(DSTAMP,8,2) + "-" + 
(SUBSTRING(DSTAMP,4,3) == "JAN" ? "01" : 
 SUBSTRING(DSTAMP,4,3) == "FEB" ? "02" : 
 SUBSTRING(DSTAMP,4,3) == "MAR" ? "03" : 
 SUBSTRING(DSTAMP,4,3) == "APR" ? "04" : 
 SUBSTRING(DSTAMP,4,3) == "MAY" ? "05" : 
 SUBSTRING(DSTAMP,4,3) == "JUN" ? "06" : 
 SUBSTRING(DSTAMP,4,3) == "JUL" ? "07" : 
 SUBSTRING(DSTAMP,4,3) == "AUG" ? "08" : 
 SUBSTRING(DSTAMP,4,3) == "SEP" ? "09" : 
 SUBSTRING(DSTAMP,4,3) == "OCT" ? "10" : 
 SUBSTRING(DSTAMP,4,3) == "NOV" ? "11" : 
 SUBSTRING(DSTAMP,4,3) == "DEC" ? "12" : " ") 
 + "-" + LEFT(DSTAMP,2) + " " + SUBSTRING(DSTAMP,11,2) + ":" +
SUBSTRING(DSTAMP,14,2) + ":" + SUBSTRING(DSTAMP,17,2) + "." +
SUBSTRING(DSTAMP,20,7))

我不明白你怎么说,
我遇到的问题是在尝试将字符串转换为datetime2时,它抛出了以下错误:
之后,你显示了数据转换输出是正确的,这意味着字符串成功转换为时间戳。您是否将
DT_STR
列映射到目标或
DT_DBTIMESTAMP2
列??派生列正在生成所需的输出。我使用派生列来正确格式化字符串,以匹配DT_DBTIMESTAMP2所期望的内容。然后尝试将字符串转换为DT_DBTIMESTAMP2并将其加载到表中。前3个进程成功完成,但该进程在OLE DB目标失败,并出现提供的错误。希望这能把事情弄清楚一点。好的。然后最好编辑该问题,并指出问题在于将DT_DBTIMESTAMP2映射到datetime 2 column时试图在派生列中强制转换并收到相同的错误。@arrchar问题不清楚,您提到问题在于将字符串值赋给datetime2时,现在在上次编辑之后,问题更清楚了,我会试着把它弄出来