Sql server 在SQL Server数据库表的十进制(18,6)列中插入2147483648或更大值时,将算术溢出转换为int

Sql server 在SQL Server数据库表的十进制(18,6)列中插入2147483648或更大值时,将算术溢出转换为int,sql-server,tsql,decimal,arithmetic-overflow,Sql Server,Tsql,Decimal,Arithmetic Overflow,我在SQL Server 2012中遇到了此问题,但在SQL Server 2017中也有此问题 我的数据库表称为MyTable,它包含一个十进制(18,6)列new\u balance,该列不可为空。该表还包含两个整数列,它们是主键的一部分。没有其他整数字段 存储过程有一个参数@new\u balance,它也被定义为十进制(18,6)。还有id(@id)和seq_num(@seq_num)的参数,它们都定义为int 该程序沿以下行在表中插入: 插入MyTable(id、序号、新余额) 值(@

我在SQL Server 2012中遇到了此问题,但在SQL Server 2017中也有此问题

我的数据库表称为
MyTable
,它包含一个
十进制(18,6)
new\u balance
,该列不可为空。该表还包含两个整数列,它们是主键的一部分。没有其他整数字段

存储过程有一个参数
@new\u balance
,它也被定义为
十进制(18,6)
。还有id(
@id
)和seq_num(
@seq_num
)的参数,它们都定义为
int

该程序沿以下行在表中插入:

插入MyTable(id、序号、新余额)
值(@id、@seq_num、@new_balance);
@new_balance
设置为2147483647.999999或更低时,插入按预期进行。
@new_balance
设置为大于或等于2147483648的数字时,例如2147483648.1,该过程将失败,并导致算术溢出将表达式转换为int error。我知道int列的最大值是2147483647

使用以下插入也会出现这种情况:

插入MyTable(id、序号、新余额)
选择@id、@seq_num、@new_balance;
鉴于参数和表列都定义为
decimal(18,6)
,我很难理解为什么在insert中会有到int的转换(特别是在第二条语句中,我不希望有任何隐式转换)

我还尝试将
@new_balance
转换为
十进制(18,6)
,作为
INSERT
语句的一部分:

插入MyTable(id、序号、新余额)
选择@id、@seq_num、CAST(@new_balance AS decimal(18,6));
这也没用

奇怪的是,如果我在查询中指定一个具有相同定义的表变量,并执行类似的插入,则效果很好:

DECLARE@MyTable表(id int,seq_num int,new_balance decimal(18,6));
插入@MyTable(id、序号、新余额)
选择@id、@seq_num、@new_balance;
我在过程中尝试过这种方法,即首先将记录插入
@MyTable
,然后尝试插入
MyTable
,如下所示:

DECLARE@MyTable表(id int,seq_num int,new_balance decimal(18,6));
在@MyTable(id,seq_num,new_balance)中插入,选择@id,@seq_num,@new_balance;
插入MyTable(id,序号,新余额)从@MyTable中选择id,序号,新余额;
这也没用

为了完整性,我还尝试创建一个值为零的记录,然后更新现有记录-同样,这是不成功的,因此插入和更新都会出现此问题:

INSERT INTO MyTable(id,seq_num,new_balance)选择@id,@seq_num,0.00;
这很好-但下一步会产生与上述报告相同的错误:

updatemytable SET new_balance=@new_balance,其中id=@id和seq_num=@seq_num;
要确认,表上没有
而不是INSERT
触发器或更新后的
触发器-没有任何类型的触发器

数据库上未启用更改跟踪,并且此特定字段没有约束-实际表中的其他十进制(18,6)字段有默认约束

数据库中也没有添加任何视图


我在这个论坛上的第一个问题——希望有人自己也经历过,也许知道如何解决它,尽管我找不到类似性质的问题。我被难住了。

在能够直接插入到程序外的表中之后,我查看了一些下游事件并确定了问题:

插入记录后,系统更新父表中关联记录的状态。此父表上有一个AFTER UPDATE,它将此状态更改标识为需要审核,并运行一个辅助过程来创建审核历史记录。作为此捕获的一部分,系统使用标量值函数将MyTable中的新旧值转换为用户友好的格式。作为这项工作的一部分,该值被分为两部分以创建必要的格式,整数部分被转换为int。通过将此转换更改为bigint,问题自行解决

因此,原来问题的前提是错误的——问题有好几个层次


感谢您的贡献。

使用SSMS查找此表中的依赖项。也许有一个索引视图?然后再次验证您查看的是正确的数据库/架构/对象,并且它没有插入触发器(您编写它时没有更新后触发器)。
要确认,没有替代插入触发器或更新后触发器
-其他类型的触发器如何?
MyTable
是否启用了更改跟踪?可能自启用CT以来,新_余额的数据类型已从
int
更改为
decimal(18,6)
。与CDC(一个日志读取器代理进程)不同,CT发生在用户事务的上下文中。那么可能使用标量函数进行某种验证的检查约束呢?为响应干杯。要确认,@GSerg-表中没有添加任何类型的触发器。