Sql 将数字(19,16)转换为数据类型数字(19,19)的算术溢出

Sql 将数字(19,16)转换为数据类型数字(19,19)的算术溢出,sql,database,Sql,Database,尝试做一些非常琐碎的事情(将numeric(19,16)类型的列转换为numeric(19,19),但不断得到算术溢出错误 ALTER TABLE X ALTER COLUMN Column1 numeric(19,19) 有什么想法吗?您有无法放入数字(19,19)中的数据-您想如何“修复”这一问题取决于您-但您需要查看不适合的数据并决定如何处理 如果所有数据均已安装,则运行正常: create table X (Column1 numeric(19,16)) create table

尝试做一些非常琐碎的事情(将numeric(19,16)类型的列转换为numeric(19,19),但不断得到算术溢出错误

ALTER TABLE X
  ALTER COLUMN Column1 numeric(19,19)

有什么想法吗?

您有无法放入
数字(19,19)
中的数据-您想如何“修复”这一问题取决于您-但您需要查看不适合的数据并决定如何处理

如果所有数据均已安装,则运行正常:

create table X (Column1 numeric(19,16))
create table Y (Column1 numeric(19,16))
insert into X(Column1) values (0.1)
insert into Y(Column1) values (1.0)
这项工作:

ALTER TABLE X
  ALTER COLUMN Column1 numeric(19,19)
这将产生以下错误:

ALTER TABLE Y
  ALTER COLUMN Column1 numeric(19,19)
因为你不能把一个带有整数部分的数字放入一个
数字(19,19)

如果要查找不符合更改的列定义的值,请首先运行以下命令:

SELECT * FROM X where ABS(Column1) >= 1.0;
数字(19,19)表示您有19位数字,所有19位都在小数点后-因此您可以存储的最大数字是0.999999999999999(0后19个9)

因此,如果在数值(19,16)列中有任何大于或等于1的值,则无法将其转换为(19,19)

数字(19,16)可以存储小数点后3位和16位,使999.999999999999999成为可能的最大数字

例如,这将起作用:

DECLARE @a NUMERIC(19,16)
SET @a = 0.1234567890123456
SELECT CAST (@a AS NUMERIC(19,19))
这不会:

DECLARE @b NUMERIC(19,16)
SET @b = 123.1234567890123456
SELECT CAST (@b AS NUMERIC(19,19))
这也不是:

SELECT CAST (1 AS NUMERIC(19,19))

编辑:Damien_不信者发布了一个很好的选择来检查不适合(19,19)的行。如果你真的想转换为数字(19,1),你应该使用它。但是,我猜你不是真的想转换为(19,19),而是保留数据,只添加3位精度-这是数字(22,19)

你在使用什么RDBMS?