VBA通过ADODB导入Excel日期到SQL Server报H80040E14错误如何处理
日期格式转换失败解决方案
你当前使用CAST(Start_Time AS datetime)直接转换失败,是因为SQL Server默认无法自动识别M/DD/YY hh:mm AM/PM这类含两位数年份、12小时制标记的非标准日期字符串,因此触发类型转换报错,可选择以下任意方案解决:
- 方案1:SQL侧指定转换格式码
直接使用SQL Server的CONVERT函数,指定对应格式码22即可完成转换,格式码22匹配mm/dd/yy hh:mi:ss AM/PM的输入结构,用法如下,替换原SQL语句中的CAST(Start_Time as datetime)即可:CONVERT(datetime, Start_Time, 22) - 方案2:VBA侧提前转成无歧义的标准日期格式
若担心两位数年份的识别歧义(SQL Server默认规则为年份值小于50识别为20xx,大于等于50识别为19xx,可能不符合业务逻辑),可以在VBA读取Excel日期后,先转成ISO 8601标准格式字符串再拼接进INSERT语句:' 读取Excel单元格日期值,转成SQL可直接识别的标准格式 Dim standardStartTime As String standardStartTime = Format(Excel单元格对象.Value, "yyyy-mm-dd HH:mm:ss") ' 后续INSERT语句直接使用该变量,无需额外SQL转换 - 方案3:使用参数化查询完全规避格式问题(推荐)
批量导入场景优先选择该方案,既不需要处理格式转换,还能避免SQL注入风险,无需拼接SQL字符串,直接传递日期类型参数即可:Dim cmd As New ADODB.Command cmd.ActiveConnection = 你已初始化的ADODB连接对象 cmd.CommandText = "INSERT INTO 目标表名 (start_time, 其他字段名) VALUES (?, ?)" ' 添加日期参数,直接传入从Excel读取的日期类型值 cmd.Parameters.Append cmd.CreateParameter("@start_time", adDateTime, adParamInput, , Excel单元格对象.Value) ' 其他参数赋值操作... cmd.Execute
内容的提问来源于stack exchange,提问作者Paul Yang
相关产品推荐
相关产品推荐

