2017-05-31 5 views
0

私はテキストを格納することができますが、数値を格納するためのカラムを持っています(私はシステムを作っていませんでした)ヌル)とその原因となるエラー: -変換されたデータ型(varchar)はまだ変換エラーを示しています

Msg 8114, Level 16, State 5, Line 1

Error converting data type varchar to numeric.

私は以下にまで問題が低下している: -

SELECT 
    T1.[FIELD_5], 
    ISNUMERIC(T1.[FIELD_5]), 
    NULLIF(T1.[FIELD_5],''), 
    ISNULL(NULLIF(T1.[FIELD_5],''),0), 
    CONVERT(DECIMAL(18,5),ISNULL(NULLIF(T1.[FIELD_5],''),0)) 
FROM 
    [MyTBL] T1 
ORDER BY 
    ISNUMERIC(T1.[FIELD_5]) 

問題のデータは[FIELD_5]

    であります
  1. 私はSQLは、私はNULLIFが正常に私はISNULL0

NULLIF結果を回している見ることができます

  • NULL値に変化していることがわかります
  • 数値ではないとしての価値を見て見ることができますが、エラーメッセージのISNULL結果結果にCONVERT、私はそれが0.00000

  • +0

    SQLサーバのどのバージョンを使用するのでしょうか?それ以降のバージョンではTRY_PARSEを使用することができます – DhruvJoshi

    +0

    スペースや印字不能な文字はありませんか?あなたは 'ISNUMERIC()'の限界を知っていますか? – HoneyBadger

    +0

    私はそれが捕まえられなかった方法を説明することはできませんが、私は '1E-07'という説明が答えにありました。 –

    答えて

    0

    これでしたより良い調査が必要な場合は、私の考えでは、SQLは通常は常にユーザーエラーではないと認識していたはずです。

    句を付けずに再度実行し、表示された最後の行(エラーを引き起こした行)の後に表示される行を選択しました。

    [FIELD_5]には、1E-07という値が含まれています(Excelから悪名高いインポート)!

    私がISNUMERICで注文したとき、リストの先頭にこの値が表示されず、実際に正しく管理されていたブランク値だけが表示されます。

    質問が解決したはずですが、私は調査に取り掛かったはずですが、これは将来他の調査に役立つために残す価値があると思います。私は、このようにTRY_PARSEまたはTRY_CONVERT機能を使用することになり、有効ではありませんそれらの値DECIMAL|NUMERIC(18, 5)を見つけるために

    +1

    'ISNUMERIC( '1E-07')'を実行すると '1'を返します。 ISNUMERIC()は数値を評価する際には寛容であることが知られています。 '$、+、--'のような文字はすべて「1」と評価されます。 – HoneyBadger

    +1

    >>>私がISNUMERICで注文したときに、リストの先頭にこの値が表示されず、実際に正しく管理されていたブランク値だけが表示されます。<<< isnumeric( 1E-07)= 1だからこそ、あなたは数字で注文するとポップアップしません。 Isnumericはさらに小数点にキャストしたい場合(18,5)、これが何らかの数値型に変換できるかどうかを示します。はい、1E-07は変換します。それはフロートに変換することができます – sepupic

    2

    使用try_convert()をもたらすことが期待される。

    SELECT T1.[FIELD_5], ISNUMERIC(T1.[FIELD_5]), NULLIF(T1.[FIELD_5], ''), 
         COALESCE(NULLIF(T1.[FIELD_5], ''), 0), 
         TRY_CONVERT(DECIMAL(18, 5), COALESCE(NULLIF(T1.[FIELD_5], ''), 0)) 
    FROM [MyTBL] T1 
    ORDER BY ISNUMERIC(T1.[FIELD_5]); 
    

    try_convert()がSQL Server 2012に導入されました。以前のバージョンを使用している場合は、case式を使用する必要があります。

    (私はどこ実用的なANSI標準関数を使用することを好むのでCOALESCE()ISNULL()を切り替える。)利用できるいくつかの非数値は、あなたが以下のようにケースとそのチェックを行うことができますがあり

    0

    select convert(decimal(18,5), '') 
    

    などのエラーをスロー「エラーが数値にデータ型varchar型に変換する。 」

    SELECT 
        T1.[FIELD_5], 
        ISNUMERIC(T1.[FIELD_5]), 
        NULLIF(T1.[FIELD_5],''), 
        ISNULL(NULLIF(T1.[FIELD_5],''),0), 
        CONVERT(DECIMAL(18,5), iif(isnumeric(ISNULL(T1.[FIELD_5]),'0') > 1,T1.[FIELD_5],'0') 
        ISNULL(NULLIF(T1.[FIELD_5],''),0)) 
    FROM 
        [MyTBL] T1 
    ORDER BY 
        ISNUMERIC(T1.[FIELD_5]) 
    
    1

    SQL2012 +

    SELECT 
        T1.ID, 
        NULLIF(T1.[FIELD_5], '') AS FIELD_5_WithNULLIF 
    FROM 
        [MyTBL] T1 
    WHERE 
        T1.[FIELD_5] IS NOT NULL -- It removes from end results NULLs (FIELD_5) 
        AND T1.[FIELD_5] <> '' -- It removes empty or SPACE(n) values (FIELD_5) 
        AND TRY_PARSE(T1.[FIELD_5] AS DECIMAL(18, 5)) IS NULL -- It removes invalid DECIMAL(18, 5) values (FIELD_5) 
    

    TRY_PARSEの動作は以下の通りです:ソース文字列値場合[N][VAR]CHARが有効なDECIMAL|NUMERIC(18, 5)である場合、新しいデータ型でその値を返します。そうでない場合はNULL - >を返し、例外(「エラー」)をスローしません。

    も参照してください:Use new TRY_PARSE() instead of ISNUMERIC() | SQL Server 2012

    さて、あなたはその後、NULLに空の文字列とも無効なソース値を変換したい場合、私は

    SELECT 
        T1.ID, 
        T1.[FIELD_5] AS OriginalValue, 
        TRY_PARSE(T1.[FIELD_5] AS DECIMAL(18, 5)) AS ConvertedValue 
    FROM 
        [MyTBL] T1 
    
    関連する問題