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.999999999999999999 (0 の後ろに 19 9 です) です。

したがって、NUMERIC (19,16) 列に 1 以上の値がある場合、(19,19) への変換に失敗します。

NUMERIC (19,16) は、小数点以下 3 桁とその後ろに 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 に答える