算术溢出错误数字到数字)数据类型

时间:2015-03-10 07:53:22

标签: sql-server

declare @val1 numeric(22,6)
declare @val2 numeric(38,15)= 12345678912345678912345.12

set @val1=convert(numeric(22,6),@val2))

select @val1

这是一个错误:

  

将数字转换为数据类型为数字的算术溢出错误。

我已经尝试了强制转换和转换但同样的错误。

3 个答案:

答案 0 :(得分:0)

declare @val1 numeric(22,6)
declare @val2 numeric(38,15)= 12345678912345678912345.12

set @val1 = convert(numeric(22,6),@val2)

select @val1

numeric(p,s)

/ * p(精度) 将存储的最小小数位总数,包括小数点的左侧和右侧。精度必须是从1到最大精度为38的值。默认精度为18。  

s(规模) 将存储在小数点右侧的小数位数。从p中减去此数字以确定小数点左侧的最大位数。可以存储在小数点右侧的最大小数位数。比例必须是从0到p的值。只有在指定精度时才能指定比例。默认比例为0;因此,0 <= s <= p。最大存储大小因精度而异。* /

从定义来看,你会理解错误。

@val1 numeric(22,6)表示您最多可存储22位数字,其中6位为小数位数=&gt;你可以存储一个16位的数字。 6位数。

第二个数字在左侧有很多值,因此SQL不知道如何转换它并抛出错误。

答案 1 :(得分:0)

由于@val1接受NUMERIC类型的数据,总共 22位,其中6位在小数点后面,16位在小数点之前。

@val2总共 25位,小数点前23位,后2位。

您应将@val1声明为:

DELCARE @val1 NUMERIC(25,2)

CONVERT使用:

SET @val1 = CONVERT(NUMERIC(25,2), @val2)

答案 2 :(得分:0)

当然将38 digit数字转换为12 digit是不明确的,但您可以将它们转换为varchar,执行您自己的转换逻辑(通过使用子字符串,concat,round等)然后转换它是数字:

declare @val1 numeric(22,6)
declare @val2 numeric(38,15)= 12345678912345678912345.12

set @val1=cast(substring(cast(@val2 as varchar(55)),1,16) as numeric(22,6)) 

select @val1