1

を に変換しようとすると、エラーが発生しvarcharますdecimal

エラーの場所を見つけましたが、修正できませんでした。

私が使用するコードは次のとおりです。

SELECT 
    CONVERT(DATETIME, dbo.PAYMENTS.recdate, 3) AS rdate,
    CONVERT(DECIMAL, dbo.PAYMENTS.amount),
    dbo.PAYMENTS.balance
FROM 
    dbo.PAYMENTS

エラーメッセージが表示されました:

データ型 varchar から数値への変換中にエラーが発生しました。

エラー-5.862は、amount列にある値が原因で発生します。

-5.862値を変更してみると、5正常に動作します。

誰でも私が値に変換するのvarcharを手伝ってくださいdecimal-5.862

ありがとう。

4

1 に答える 1

4

ここでの問題は 2 つあります。

  1. 数値をテキストとして保存しています
  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 として保存しないでください。それは起こるのを待っている災害です(あなたはすでに理解しています)。

于 2013-07-17T13:47:10.380 に答える