0

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

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

有任何想法吗?

4

2 回答 2

2

你有不适合的数据numeric(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)

因为您不能将具有任何整数部分的数字放入numeric(19,19).

如果要查找不适合更改后的列定义的值,请先运行:

SELECT * FROM X where ABS(Column1) >= 1.0;
于 2013-04-15T13:01:25.440 回答
0

NUMERIC(19,19) 表示您有 19 位数字,所有 19 位都在小数点后面 - 所以您可以存储的最大数字是 0.99999999999999999999(0 后面 19 个 9。)

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

NUMERIC (19,16) 可以存储小数点后三位和后面的 16 - 使 999.9999999999999999 成为可能的最大数字。

例如,这将起作用:

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_The_Unbeliever 发布了一个不错的选择来检查不适合 (19,19) 的行,如果你真的想转换为 NUMERIC (19,1),你应该使用它 - 但是,我猜你不真的想转换为 (19,19) 而是保留您的数据并仅添加 3 位精度 - 即 NUMERIC(22,19)

于 2013-04-15T13:05:34.280 回答