规则或触发器会导致意外的溢出错误
我有一个场景,我需要某个触发器来触发表中的所有行。规则或触发器会导致意外的溢出错误
据我所知,最简单的方法是执行一个愚蠢的更新,定义为一个完全不会改变数据的更新,然后执行。一个简单的例子是这样的一个:
update PFUNC set CODCOLIGADA = CODCOLIGADA
这一直工作正常,到现在为止,但是,我们插入到这一点我有一个非常奇怪的错误一个新的生产数据库,执行上面的例子:
The conversion of the varchar value '301947' overflowed an INT2 column. Use a larger integer column.
这是毫无意义的,因为如果一个值存储在一个单元格中,它当然应该符合该表模式定义的数据类型。
但是忍受我......让它变得更加怪异,这张表甚至没有连续的字段CODCOLIGADA包含301947.执行select CODCOLIGADA from dbo.PFUNC where CODCOLIGADA = 301947
不会产生任何结果。
如果我这样做,使用引号,我得到与上述相同的数据类型的错误:
select codcoligada from dbo.PFUNC where CODCOLIGADA = '301947'
回报
The conversion of the varchar value '301947' overflowed an INT2 column. Use a larger integer column.
这是版本信息:
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015 12:32:14 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 (Build 9600:)
我的理解是,如果该值(301947)包含在表中,它应该以某种方式被截断,因为它违反了现存的模式。如果它不在那里,更新会中断是没有意义的。
我在这里错过了一些警告或怪癖阴影行为?
UPDATE:详细的用户定义类型
THER是RULE绑定到数据类型,RCODCOLIGADA
。 问题在于这个规则。
这里是重现该错误的代码:
create rule varchar_rule
as
@cod not in ('301947');
go
create table dbo.test_rule (cod smallint);
go
exec sp_bindrule 'varchar_rule', 'dbo.test_rule.cod'
go
insert into dbo.test_rule
values(1);
Msg 244, Level 16, State 2, Line 22 The conversion of the varchar value '301947' overflowed an INT2 column. Use a larger integer column. The statement has been terminated.
该规则所输入的值,是完美SMALLINT为varchar值“301947”相比较(其可以是like
,in
,<>
或任何其他比较)。
smallint数据类型具有尊重varchar的优先级,所以没有将smallint转换为varchar,反之,varchar转换为smallint,因此会出现错误。
也许前几天您的用户定义的类型基本类型为int而不是SMALLINT所以转换永远不会出错
这看起来像一个用户定义的数据类型列。你可以发布这个定义吗? – VKarthik
@VKarthik,我更新了帖子,包括 –
您确定要更正正确的数据库和模式表吗?我们很多人犯了在SSMS中选择了错误的数据库的错误 – scsimon