Sybase dblib调用存储过程正常,isql执行报错问题求助
问题原因与解决办法
核心原因
C++通过dblib调用存储过程时,不是以字符串形式传递datetime参数——dblib会通过参数绑定机制直接传递datetime类型的数据,跳过了字符串到datetime的隐式转换步骤。而在isql命令行中,你直接传入了字符串格式的日期,此时Sybase需要进行隐式转换,但你的会话日期格式设置不匹配,导致转换失败。
默认情况下,很多Sybase会话的dateformat设置为mdy(月/日/年),当你传入22/9/2022时,数据库会把22当作月份处理,而月份最大是12,自然触发算术溢出错误。
解决方法
方法1:临时修改会话日期格式
在isql中执行存储过程前,先设置会话的日期格式为dmy(日/月/年):
set dateformat dmy go process_write '000000100', '22/9/2022 10:18:37', 1 go
方法2:使用Sybase通用的日期格式
直接采用YYYY-MM-DD HH:MM:SS格式,这种格式不受会话dateformat设置影响:
process_write '000000100', '2022-09-22 10:18:37', 1 go
方法3:显式转换日期字符串
通过convert函数指定格式代码(103对应dd/mm/yyyy),强制数据库按正确格式转换:
process_write '000000100', convert(datetime, '22/9/2022 10:18:37', 103), 1 go
内容的提问来源于stack exchange,提问作者kirant
相关产品推荐
相关产品推荐

