ここでの問題は 2 つあります。
- 数値をテキストとして保存しています
- そのテキスト列への入力を検証していません
あなたのコメントは、値が次のように保存され、次のようでは- 5.862
ないと言っています: -5.862
。
そこで、試してみる SQL を次に示します。
select convert(decimal, '-5.862')
select convert(decimal, '- 5.862')
最初の "動作" (ただし、それに戻りましょう)、2 番目の例外がスローされることに注意してください。
ここでの本当の答えは、数値をテキストとして保存するのではなく、最初から適切な数値データ型で保存することです。それを除いて、少なくとも入力を検証し、マイナス記号と数字の間にスペースを許可しないなど、その列のデータベースに忍び寄る非数値を許可しないようにします。
テーブルに不正なデータを入力しないでください。そうすることで作業を節約することはありません。既存のデータを機能させるために実行する必要がある検証と修正は、データがテーブルに入力される時点で行う方がはるかに適切です。
ズボンを暖かく保つのに似た「応急処置」は次のとおりです。
select convert(decimal, replace('- 5.862', ' ', ''))
しかし、これは誰かがこれを入力するまで問題を延期するだけです:
-5,862
twenty
!27
すなわち。どちらか変換できない他のもの。それらをテキストとして保存しているため、元の場所ではなく、使用する場所で悪い値を修正するためにすべての作業を行う必要があります。
ただし、ここで他の人が示唆しているように、別の問題があります。それは、DECIMAL
デフォルトでは小数点以下の数字を許可しないため、上記で機能するものは-6
.
この問題を解決するには、精度を指定します。
select convert(decimal(18, 5), '-5.862')
ただし、これを十分に強く言うことはできません。数値を text として保存しないでください。それは起こるのを待っている災害です(あなたはすでに理解しています)。