2017-07-19 107 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所以轉換永遠不會出錯