かなり些細なことをしようとしています (numeric(19, 16) 型の列を numeric(19, 19) に変換しますが、算術オーバーフロー エラーが発生し続けます。
ALTER TABLE X
ALTER COLUMN Column1 numeric(19,19)
何か案は?
に収まらないデータがあり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;
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)です