2017-08-17 7 views
0

でグループを使用する場合、「データ型intに 『その他』のnvarchar値を変換する際の変換に失敗しました」エラーが表示されます。私は、次のSQL文を実行すると、私は句

SELECT 
    timecollected, SUM(waitingtaskscounttotal) waitingtaskscounttotal 
FROM 
    (SELECT 
     timecollected, CAST(raw_value AS INT) AS waitingtaskscounttotal 
    FROM 
     spotlight_perfdata sp 
    JOIN 
     spotlight_stat_names sn ON sp.statistic_name_id = sn.statistic_name_id 
           AND sn.statistic_class_id = CONVERT(NVARCHAR, @statistic_class_id) 
    WHERE 
     sp.statistic_class_id = CONVERT(NVARCHAR, @statistic_class_id) 
     AND (sp.timecollected >= convert(NVARCHAR, @firstdate, 126) 
       AND sp.timecollected <= convert(NVARCHAR, @lastdate, 126)) 
     AND sp.monitored_object_id = CONVERT(NVARCHAR, @monitored_object_id) 
     AND sn.statistic_name = 'waitingtaskscounttotal') TableA 
GROUP BY 
    timecollected 
ORDER BY 
    timecollected DESC 

を私はエラーを取得:

Conversion failed when converting the nvarchar value 'MISCELLANEOUS' to data type int.

しかし、私は、SQL文から列timecollectedを取り除いた後、それが働いた:

SELECT 
    SUM(waitingtaskscounttotal) waitingtaskscounttotal 
FROM 
    (SELECT 
     timecollected, CAST(raw_value AS INT) AS waitingtaskscounttotal 
    FROM 
     spotlight_perfdata sp 
    JOIN 
     spotlight_stat_names sn ON sp.statistic_name_id = sn.statistic_name_id 
           AND sn.statistic_class_id = CONVERT(NVARCHAR, @statistic_class_id) 
    WHERE 
     sp.statistic_class_id = CONVERT(NVARCHAR, @statistic_class_id) 
     AND (sp.timecollected >= convert(NVARCHAR, @firstdate, 126) 
       AND sp.timecollected <= convert(NVARCHAR, @lastdate, 126)) 
     AND sp.monitored_object_id = CONVERT(NVARCHAR, @monitored_object_id) 
     AND sn.statistic_name = 'waitingtaskscounttotal') TableA 

私は何が間違っているのか分かりません。

+1

あなたのデータはraw_valueに 'MISCELLANEOUS'という値があり、これを** cast(raw_value AS INT)**としてintに変換しようとしているので、エラーが表示されます。 –

+0

はい、raw_value列の型はsql_variantですが、値はMISCELLANEOUSですが、Wh​​ere句でフィルタリングします。問題は2番目の文が動作する理由です。 –

+3

問題は、クエリオプティマイザが評価方法を並べ替えることができることですこの文は、 'int'変換を試みる前に' where'節フィルタが適用されるという保証はありません。これは、バリアントを使用するデザインに対して常に推奨し、格納される可能性のあるさまざまなタイプの値に複数の列を使用することです(適切なチェック制約を使用して、正しい列がNULLになることを保証します。保存する) –

答えて

0

変更この:これに

CAST(raw_value AS INT) 

CASE 
WHEN raw_value like '%[0-9]%' and not raw_value like '%[^0-9]%' 
OR raw_value like '-%[0-9]%' and not raw_value like '-%[^0-9]%' 
THEN CAST(raw_value AS int) 
ELSE NULL 
END 

これは私がフィルタリングされたデータを保存し、問題を回避するにはint型でないものはすべて、NULL

0

を行いますwhere句をテンポラリテーブルに追加し、int変換を実行します。

関連する問題