我使用Sybase DB,并使用dblib接口(C++接口(将命令连接并传递到Sybase DB。我在Sybase数据库中添加了一个存储过程。以下是存储过程的签名:
创建过程process_write@id varchar(35(,@pTime datetime,@status tinyint
我用下面的代码调用这个存储过程:
process_write'000000100','22/9/2022 10:18:37',1
现在,当我运行代码时,我在控制台上没有看到错误,并且存储过程成功执行,但当我在isql命令提示符下运行时,我会得到以下错误:
消息247,级别16,状态1:服务器"ABCXYZ",过程"process_write":VARCHAR值"22/9/2022 10:18:37"隐式转换为DATETIME字段期间出现算术溢出。(返回状态=-6(
我不知道这是如何在代码中工作的,但在isql控制台中失败了?
tl;dr
ASE
默认将格式为X/Y/Z
的字符串处理为M/D/Y
,这可能解释了isql
会话生成错误的原因(即,isql
会话以mdy
作为其默认dateformat
运行(。我的猜测是,在dblib/C++
代码的某个地方,您修改了dblib/C++
会话使用的dateformat
或language
,这反过来又确保了您的proc调用正常工作(即,不会生成转换错误(。
我不使用dblib/C++
,所以我不知道你是否需要修改数据库连接属性,或者你是否只是在成功连接时发出T-SQL
命令,例如:
set dateformat 'dmy'
在SybaseASE
中,当将字符串处理为日期时,有必要告诉ASE
字符串(如X/Y/Z
(中日期组件的顺序。
严格从T-SQL
的角度来看,有两个set
选项可以告诉ASE
如何将X/Y/Z
解释为日期:
set dateformat <format>
-其中<format>
是'mdy'
、'myd'
、'ymd'
、'ydm'
、'dmy'
和'dym'
之一;默认值为'mdy'
set languange <language>
-<language>
的位置取决于您加载到ASE
中的语言;默认值为'us_english'
,这会导致日期格式默认为'mdy'
[我没有关于个别语言是否/如何修改dateformat
的详细信息,因此您需要在环境中运行一些测试]
注意:
- 有关详细信息,请参阅T-SQL用户指南:日期格式和参考手册:命令:集
- 查看会话中使用的当前
dateformat
:select get_appcontext('SYS_SESSION','dateformat')
演示set dateformat
与存储过程的使用:
create proc testp
@pTime datetime
as
select @pTime
go
-------------
select get_appcontext('SYS_SESSION','dateformat')
go
---
mdy <<<--- ASE default
exec testp '22/9/2022 10:18:37'
go
Msg 247, Level 16, State 1:
Server 'ASE400', Procedure 'testp':
Arithmetic overflow during implicit conversion of VARCHAR value '22/9/2022 10:18:37' to a DATETIME field .
----------------
set dateformat 'dmy'
go
select get_appcontext('SYS_SESSION','dateformat')
go
---
dmy
exec testp '22/9/2022 10:18:37'
go
-------------------
Sep 22 2022 10:18AM