关于DTS中“映射列转换”中的怪事

samdx 2004-01-30 09:59:37
[目的:]
把一个.csv的文件数据导入到一个数据表中,CSV文件行格式如下:
"01/09/2004 17:15:00.031","721358848","249421824","2.3365637893972773","10899456","99.999206330139927","831.48385781937316","0"
其中需要把"01/09/2004 17:15:00.031"的这一列转换成DATETIME格式,也就是说"2004-1-9 17:15:00.031"
[过程:]
1.导入数据
2.选择数据源:文本文件:TEST.CSV
3.选择文件格式:选择跳过第一行(因已经建表,并存在列名,且TEST.CSV第一行包含列名),其他选择默认。
4.选择源表和视图:选择转换-->转换-->在将信息复制到目的时对其进行转换-->脚本修改如下:(China_Standard_Time为DATETIME型)
原:DTSDestination("China_Standard_Time") = DTSSource("Col001")
修改a:DTSDestination("China_Standard_Time") = Convert(DATETIME,DTSSource("Col001"))
修改b:DTSDestination("China_Standard_Time") = CAST(DTSSource("Col001") AS DATETIME)
修改c:DTSDestination("China_Standard_Time") = CDATE(DTSSource("Col001"))
5.按下一步导入。
[结果:]
无论按照上面abc那一种修改,都无法导入库。
出现下面的错误:
=====================================================================
*在转换"AxScriptXform"期间在行号为1处出错。到目前为止遇到错误数:1。*
*错误代码:0 *
*错误源=Microsoft VBScript 运行时错误 *
*错误描述:类型不匹配:'Convert' *
*第7行出错 *
=====================================================================
查看第7行数据,并没有异常:
"01/09/2004 18:15:00.031","722309120","248434688","1.6300002106449232","10768384","1.8131510333333378","794.02343594498006","0"

望各位赐教!谢谢大家!
...全文
40 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chump 2004-01-30
  • 打赏
  • 举报
回复
1:Convert cast是SQL的函数,在vb script中怎么能用呢?
2:CDATE只能转换不带毫秒的日期数据,01/09/2004 18:15:00是可以的,而01/09/2004 18:15:00.031是不行的!!
3:kseven(没风格)将数据中的毫秒去掉了!!
4:如果要保存毫秒得想其他办法了。
kseven 2004-01-30
  • 打赏
  • 举报
回复
FormatDateTime(LEFT(DTSSource("Col001"),Instr(1,DTSSource("Col001"),".")-1), 0)
这样就可以了,主要是vb的转换函数的问题
samdx 2004-01-30
  • 打赏
  • 举报
回复
这个的确是个好方法!//agree
还想请教txlicenhe(马可)兄:为什么用DTS不行呢,因为我看SQL的帮助,都是用CDATE(.....)的方法的。真的很纳闷
txlicenhe 2004-01-30
  • 打赏
  • 举报
回复
下面是我的测试:
1: 把如下内容存到c:\abc.txt
"01/29/2004 19:50:41.111","aaa"
"01/29/2004 19:53:42.211","bbb"
2: 建立测试环境
use master
go
if object_id('test') is not null
drop table test
go
create table test(a datetime,b char(10))
3: 导入数据,用SQL语句导入
xp_cmdshell 'bcp master..test in c:\abc.txt -c -t ,'
4: 查看结果
select * from test
/*
a b
------------------------------------------------------ ----------
2004-01-29 19:50:41.110 "aaa"
2004-01-29 19:53:42.210 "bbb"

(所影响的行数为 2 行)
*/
samdx 2004-01-30
  • 打赏
  • 举报
回复
如果是先把TEST.CSV入库,系统会自动把所有列都变成varchar格式。成功。
再修改表结构,再把第一列的Varchar改成DATETIME格式,保存。也成功,并且SQL已经自动把
01/09/2004 17:15:00.031
转换成:
2004-1-9 17:15:00.031

samdx 2004-01-30
  • 打赏
  • 举报
回复
谢谢各位指教!

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧