sql >> データベース >  >> RDS >> Sqlserver

SQLServerのメッセージ8117「オペランドデータ型varcharが合計演算子に対して無効です」を修正しました

    SQLServerエラーメッセージ8117とメッセージOperanddata type varchar is invalid for sum operator が表示された場合 、演算子または関数に間違ったデータ型を渡しているためです。

    この場合、エラーは、文字列をSUM()に渡していることを示しています。 働き。 T 彼はSUM() 関数は文字列に対しては機能しません。数値タイプでのみ機能します。

    同じエラー(メッセージ8117)は、他のコンテキストでも発生する可能性があります。これは、SUM()に限定されません。 機能。

    エラーの例

    エラーを生成するコードの例を次に示します。

    SELECT SUM(ProductName) 
    FROM Products;

    結果:

    Msg 8117, Level 16, State 1, Line 1
    Operand data type varchar is invalid for sum operator.

    この場合、ProductNameを合計しようとしています 桁。

    この場合、ProductNameである可能性が高いです。 列はvarcharです 桁。おそらく間違った列があります。

    ソリューション1

    このエラーを修正するには、最初に正しい列があることを確認する必要があります。正しい列がない場合は、正しい列に変更してください:

    SELECT SUM(Price) 
    FROM Products;

    うまくいけば、それは問題を解決します。言い換えれば、うまくいけばPrice 列は本来あるべき数値です。

    しかし、そうでない場合はどうなりますか?

    ソリューション2

    正しい列があるのに、その列が不適切なデータ型を使用している場合があります。たとえば、Price 列は実際にはvarcharとして定義されていました 列。

    その場合、同じエラーが発生します:

    SELECT SUM(Price) 
    FROM Products;

    結果:

    Msg 8117, Level 16, State 1, Line 1
    Operand data type varchar is invalid for sum operator.

    一見すると、このステートメントに問題はないように見えます。私たちが行っているのは、Priceの値の合計を取得することだけです。 桁。これは、SUM()の完璧な例です。 関数は実行するように設計されています。

    もちろん、ここでの前提は、Price 列は数値です。ただし、エラーメッセージによると、数値ではなく、varcharです。 。

    列のデータ型を確認しましょう:

    SELECT
        DATA_TYPE, 
        CHARACTER_MAXIMUM_LENGTH AS MAX_LENGTH, 
        CHARACTER_OCTET_LENGTH AS OCTET_LENGTH 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Products' 
    AND COLUMN_NAME = 'Price';

    結果:

    +-------------+--------------+----------------+
    | DATA_TYPE   | MAX_LENGTH   | OCTET_LENGTH   |
    |-------------+--------------+----------------|
    | varchar     | 255          | 255            |
    +-------------+--------------+----------------+

    疑わしいように、列のタイプはvarcharです。 。

    この場合、2つのオプションがあります。列のタイプを変更するか、合計を取得するときにそのタイプをその場で変換します。

    そのタイプをその場で変換しましょう:

    SELECT SUM(CAST(Price AS decimal(8,2))) 
    FROM Products;

    結果:

    48.25

    幸い、これはうまくいきました。

    この場合、Priceのすべてのデータ 列は数値タイプに変換できます。

    データ型varcharから数値への変換エラーのようなエラーメッセージ8114が発生した場合 、それは、列に数値に変換できないデータが含まれていることを意味します。

    エラーは次のようになります:

    Msg 8114, Level 16, State 5, Line 1
    Error converting data type varchar to numeric.

    この場合、数値以外のデータを見つけて、それをどうするかを決める必要があります。

    数値以外の値を見つける方法は次のとおりです。

    SELECT Price
    FROM Products
    WHERE ISNUMERIC(Price) <> 1;

    結果:

    +-------------+
    | Price       |
    |-------------|
    | Ten dollars |
    | Fifteen     |
    +-------------+

    犯人を見つけました!

    そうしない正当な理由がない限り、これらの値を同等の数値に変更する必要があります。

    その後、このタイプのデータが将来挿入されないように、列のデータ型を変更することを検討する必要があります。 これを行うと、データの整合性を強化するのに役立ちます。

    ISNUMERIC()を使用する際に注意すべき点が1つあります。 機能は、誤検知を返すことがあるということです。私が言いたいのは、数字として解釈されるいくつかの非数字文字があるということです。 ISNUMERIC()を使用すると正を返す非数字を参照してください。 詳細については。


    1. 重複キーの更新で挿入と同じ

    2. SELECT FOR UPDATEは、行が存在しないときに他の接続が挿入されるのを防ぎますか?

    3. SQL Serverでのdatetimeとdatetimeoffsetの違い:違いは何ですか?

    4. 列名を生成する動的SQL?