declare @val1 numeric(22,6)
declare @val2 numeric(38,15)= 12345678912345678912345.12
set @val1=convert(numeric(22,6),@val2))
select @val1
这是一个错误:
将数字转换为数据类型为数字的算术溢出错误。
我已经尝试了强制转换和转换但同样的错误。
答案 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