所以我想从txt导入日期时间:
2015-01-22 09:19:59
使用数据流进入表。我有我的平面源文件和我的目标数据库设置正常。我在高级设置中将该列的txt输入的数据类型更改为输入和输出属性:
数据库时间戳[DT_DBTIMESTAMP]
这与用于表的数据库的数据类型相同,因此这应该有用。
然而,当我执行包时,我收到一条错误,说数据转换失败了...我该如何做到这一点?
[Import txt data [1743]] Error: Data conversion failed. The data conversion for column "statdate" returned status value 2 and status text "The value could not be converted because of a potential loss of data.".
[Import txt data [1743]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "output column "statdate" (2098)" failed because error code 0xC0209084 occurred, and the error row disposition on "output column "statdate" (2098)" specifies failure on error. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure.
[Import txt data [1743]] Error: An error occurred while processing file "C:\Program Files\Microsoft SQL Server\MON_Datamart\Sourcefiles\tbl_L30T1.txt" on data row 14939.
在他给出错误的行上,日期时间用空格填充。这就是为什么在桌面上"允许空值"检查,但我的SSIS包由于某种原因给出错误...我可以在某处告诉包允许空值吗?
答案 0 :(得分:0)
我建议您将数据导入到字符字段中,然后在输入后解析它。
以下功能可以帮助您:
SELECT IsDate('2015-01-22 09:19:59')
, IsDate(Current_Timestamp)
, IsDate(' ')
, IsDate('')
当{em>认为值为日期时,IsDate()
函数会返回 1 ,如果不是,则 0 。
这将允许您执行以下操作:
SELECT value_as_string
, CASE WHEN IsDate(value_as_string) = 1 THEN
Cast(date_as_string As datetime)
ELSE
NULL
END As value_as_datetime
FROM ...
答案 1 :(得分:0)
我自己解决了。谢谢你的建议,但我做的方式更容易。
在平面文件源中,在高级选项卡中建立新连接时,我根据数据库中的表修复了所有数据类型除了带有时间戳的列(在我的例子中,它被称为“statdate”)!我将此数据类型更改为 STRING ,因为否则我的平面文件源会在任何脚本能够执行之前给我转换错误,并且唯一的方法就是将错误输出设置为忽略我不想要的失败。 (通过右键单击平面文件源 - > gt;显示高级编辑器 - >转到输出列并将数据类型从Date更改为更改后,您仍需要在高级设置中将其设置为字符串后更改数据类型字符串)。
将时间戳设置为字符串后,我添加了带有此表达式的派生列以删除所有空格,然后将其赋予“NULL”值:
TRIM(<YourColumnName>) == "" ? (DT_STR,4,1252)NULL(DT_STR,4,1252) : <YourColumnName>
接下来,我添加了一个数据转换,将字符串设置回时间戳。数据转换最终连接到OLE DB目标。
我希望这可以帮助将来遇到同样问题的任何人。
最终结果:Picture of data flow