2017-07-19 148 views
1

我有一个场景,我需要某个触发器来触发表中的所有行。规则或触发器会导致意外的溢出错误

据我所知,最简单的方法是执行一个愚蠢的更新,定义为一个完全不会改变数据的更新,然后执行。一个简单的例子是这样的一个:

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.

这是这一领域的信息: enter image description here

这是版本信息:

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:详细的用户定义类型

DCODCOLIGADA

+0

这看起来像一个用户定义的数据类型列。你可以发布这个定义吗? – VKarthik

+0

@VKarthik,我更新了帖子,包括 –

+0

您确定要更正正确的数据库和模式表吗?我们很多人犯了在SSMS中选择了错误的数据库的错误 – scsimon

回答

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 The conversion of the varchar value '301947' overflowed an INT2 column. Use a larger integer column. The statement has been terminated.

该规则所输入的值,是完美SMALLINT为varchar值“301947”相比较(其可以是likein<>或任何其他比较)。

smallint数据类型具有尊重varchar的优先级,所以没有将smallint转换为varchar,反之,varchar转换为smallint,因此会出现错误。

也许前几天您的用户定义的类型基本类型为int而不是SMALLINT所以转换永远不会出错