Sybase dblib存储过程



我使用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++会话使用的dateformatlanguage,这反过来又确保了您的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用户指南:日期格式和参考手册:命令:集
  • 查看会话中使用的当前dateformatselect 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

相关内容

  • 没有找到相关文章

最新更新