规则或触发器导致意外溢出错误

时间:2017-07-19 22:59:28

标签: sql-server triggers rule integer-overflow

我有一个场景,我需要为表中的所有行触发某个触发器。

据我所知,最简单的方法是执行一个愚蠢的更新,即定义为根本不更改数据的更新,只执行。一个简单的例子就是这个:

update PFUNC set CODCOLIGADA = CODCOLIGADA

到目前为止一直运行良好但是在我们插入的新生产数据库中我有一个非常奇怪的错误,执行上面的例子:

  

varchar值'301947'的转换溢出了INT2列。       使用更大的整数列。

这完全没有意义,因为如果值存储在单元格中,它当然应该符合该表模式定义的数据类型。

但请耐心......为了让它更奇怪,这个表甚至没有包含301947的CODCOLIGADA字段。执行select CODCOLIGADA from dbo.PFUNC where CODCOLIGADA = 301947没有结果。

如果我使用引号,我会得到与上面相同的数据类型错误:

select codcoligada from dbo.PFUNC where CODCOLIGADA = '301947'

返回

  

varchar值'301947'的转换溢出了INT2列。       使用更大的整数列。

这是此字段的信息: enter image description here

这是版本信息:

  

Microsoft SQL Server 2008 R2(SP3) - 10.50.6220.0(X64)2015年3月19日12:32:14版权所有(c)Windows NT 6.3(Build 9600:)上的Microsoft Corporation Enterprise Edition(64位)

我的理解是,如果表中包含该值(301947),则应该以某种方式截断它,因为它仅仅通过现有违反了模式。如果它不存在,那么更新就没有意义。

我在这里错过了一些警告或怪癖的阴影行为吗?

更新:详细说明用户定义的类型

DCODCOLIGADA

1 个答案:

答案 0 :(得分:1)

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 varchar的转换   值'301947'溢出INT2列。使用更大的整数列。   声明已经终止。

该规则将输入的完美smallint值与varchar值'301947'进行比较(可以是likein<>或任何其他比较。

smallint数据类型的优先级是varchar,因此没有转换smallint到varchar但是反向,varchar到smallint,所以你得到错误。

也许几天前,用户定义类型的基类型是int而不是smallint,因此转换永远不会出错