2009-08-10 9 views
1

私のアプリケーションではsql2000が使用され、使用するselect文が失敗することがあります。一週間かそこら選択戻るとSUM関数を使用した時折の変換エラー

SQLエラー

「数値へのデータ型varchar型の変換エラー」:

sum(case when ISNULL(form_prsn_id, -1) = irpd_prsn_id 
          then convert(dec(11,2), case when valu_value = '' 
                 then '0' 
                 else isnull 
(valu_value,'0') 
                 end)* case when 
fmdt_deduction_flag = 'Y' 
                    then -1 
                    else 1 
                    end 
          else 0 
          end) as client_sum 

valu_valueフィールドには、いくつかの数値といくつかのvarchar型varchar型と店舗です。しかし、私の結合とWHERE句のフィルタを含む

それは常に数値または空の文字列を選択します。 それが失敗したとき、私はSUMを削除することができます、データを参照して、その数値を知っている。 なぜSUM関数は時には(例えば5%の時間)数値データで失敗するのでしょうか? SQLが何らかの形で "先を見越し"して、合計なしで返された行以上の10進数に変換できるかどうか疑問に思います。 私は含ま修正を発見したノート(ISNUMERIC(valu_value)= 1)

おかげ

答えて

1

このようなものは、(時々)が起こります。この問題は、SQL Serverがクエリに対して生成する実行計画の(ほぼ)常にです。 SQL Serverが参加/条件演算​​子を使用する前に、SQL Serverが変換を実行することがあります。だからこそあなたは誤りを起こす。

ヒントを使用して特定の[実行]プランを強制したり、追加の条件を導入することは、こうした問題を解決するための鍵です。

0

これを試してみてください。

sum(case 
     when ISNULL(form_prsn_id, -1) = irpd_prsn_id then convert(dec(11,2), case 
                       when ISNUMERIC(valu_value)=1 THEN valu_value 
                       else 0 
                      end 
                   )* case 
                     when fmdt_deduction_flag = 'Y' then -1 
                     else 1 
                    end 
     else 0 
    end 
    ) as client_sum 

違いはここにある:

OLD

case 
    when valu_value = '' then '0' 
    else isnull(valu_value,'0') 
end 

NEW

case 
    when ISNUMERIC(valu_value)=1 THEN valu_value 
    else 0 
end 
0

あなたはどのように言っていないとしてだけで簡単に考えましたvalu_valueがnumであることを確認していますそれはコンマを含むことができますか?例:

select isnumeric('23,00') 

パス!

select convert(dec(11,2),'23,00') 

FAIL - データ型varcharを数値に変換中にエラーが発生しました。

0

私は以前これを遭遇しました。根本的な原因は、実行計画に基づいてjoinまたはwhereステートメントを実行する前のSQL Server 2005変換プロセスです。

私の場合は、次のとおりです。

SELECT Convert(decimal(18,0), NVarcharColumn) FROM Table1 
WHERE isnumeric(NvarcharColumn) = 1 

SELECT Convert(decimal(18,0), NVarcharColumn) FROM Table1 

私はステートメントを変更することにより、それを解決します

関連する問題