web-dev-qa-db-ja.com

varchar値「simple」をデータ型intに変換するときに変換が失敗しました

私はこの問題に数日間苦労しており、どうすれば修正できるかわかりません。

私はgroup by値のテーブル12345を作成したいと思います一時テーブルこの値で。

次に、このテーブルをINNER JOINの他のテーブルと一緒にa.value = #myTempTable.numする必要があります。

しかしa.valuentextであるため、実際に行ったことをCONVERTする必要がありますが、エラーが発生します。

Varchar値 'simple、'をデータ型intに変換するときに変換が失敗しました。 (7行目)

Create table #myTempTable
(
num int
)
insert into #myTempTable (num) values (1),(2),(3),(4),(5)

 SELECT a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) AS value, COUNT(*) AS pocet   
 FROM 
 (SELECT item.name, value.value 
  FROM mdl_feedback AS feedback 
  INNER JOIN mdl_feedback_item AS item 
       ON feedback.id = item.feedback
  INNER JOIN mdl_feedback_value AS value 
       ON item.id = value.item 
   WHERE item.typ = 'multichoicerated' AND item.feedback IN (43)
 ) AS a 
 INNER JOIN #myTempTable 
     on CONVERT(INT, CONVERT(VARCHAR(12), a.value)) = #myTempTable.num
 GROUP BY a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) ORDER BY a.name

 drop table #myTempTable

最後のINNER JOINなしではこのエラーは発生しません

INNER JOIN #myTempTable on CONVERT(INT, CONVERT(VARCHAR(12), a.value))
= #myTempTable.num

私を手伝ってくれますか?私は必死です。

ありがとう。

22
ChangeTheWay

このようなエラーを回避するには、CASE + ISNUMERICを使用して、intに変換できないシナリオを処理できます。
変化する

CONVERT(INT, CONVERT(VARCHAR(12), a.value))

CONVERT(INT,
        CASE
        WHEN IsNumeric(CONVERT(VARCHAR(12), a.value)) = 1 THEN CONVERT(VARCHAR(12),a.value)
        ELSE 0 END) 

基本的に、これはあなたが私をintに割り当てることができない場合に0の値を割り当てることを言っています(私の例では)

または、a.valueが数値であるかどうかを確認するカスタム関数の作成に関するこの記事をご覧ください。 http://www.tek-tips.com/faqs.cfm?fid=642

41
Milen

比較を実行するためにintsに変換するだけの場合、テーブル定義をvarcharの使用に切り替えるだけです。

Create table #myTempTable
(
num varchar(12)
)
insert into #myTempTable (num) values (1),(2),(3),(4),(5)

残りのクエリから試行されたCONVERTsをすべて削除します。

 SELECT a.name, a.value AS value, COUNT(*) AS pocet   
 FROM 
 (SELECT item.name, value.value 
  FROM mdl_feedback AS feedback 
  INNER JOIN mdl_feedback_item AS item 
       ON feedback.id = item.feedback
  INNER JOIN mdl_feedback_value AS value 
       ON item.id = value.item 
   WHERE item.typ = 'multichoicerated' AND item.feedback IN (43)
 ) AS a 
 INNER JOIN #myTempTable 
     on a.value = #myTempTable.num
 GROUP BY a.name, a.value ORDER BY a.name

Varcharをintに変換する場合、小数点以下の桁数がないことを確認してください。

たとえば、値(12345.0)のvarcharフィールドを整数に変換している場合、この変換エラーが発生します。私の場合、すべてのフィールドの末尾が.0であるため、次のステートメントを使用して問題をグローバルに修正しました。

CONVERT(int, replace(FIELD_NAME,'.0',''))
2
Arima