2017-08-15 24 views
0

クエリに問題がありますか?私が変換しようとしていますintvarcharに:変換の問題が発生する理由

DELETE FROM CM_OfflineMessages 
WHERE CONVERT(INT, CONVERT(VARCHAR(MAX), ID)) IN ('1,2,3') 

は、私はこのエラーを取得する:

Conversion failed when converting the varchar value '1,2,3' to data type int.

編集:私は、クエリ

[dbo].[CM_DeleteOfflineMessageByID] (@ID AS VARCHAR(MAX)) 
    DELETE FROM CM_OfflineMessages 
    WHERE CONVERT(VARCHAR(MAX), ID) IN (@ID) 

しかしなしのコンパイルに編集した

データはパージされません。あなたはvarchar型にintを変換し、バックしようとしている

exec [dbo].[CM_DeleteOfflineMessageByID] @ID = N'''10'',''11'',''12''' 
+0

あなたはINTへの変換されています。CONVERT(INT、 ..) – Serg

+1

あなたは 'どこのID(1,2,3)'を意味していませんでしたか? – Serg

+0

ここで問題となっているのは引用符です。IDが文字列 '1,2,3'と比較しようとしていますが、それは間違っています。引用符を削除しても動作します。 –

答えて

1

  • CONVERT(VARCHAR(max), ID)varchar(max)intから(ID
  • CONVERT(INT, ...)が戻っint

に結果を変換しますあなたはですINの左側にあるの場合、RDBMSは右側のリストの各要素をintにも変換しようとします。 '1,2,3'の変換が失敗し、エラーが発生します。

あなたはvarcharIDを変換し、INリスト内varcharリテラルを使用したい場合は、外側の変換ドロップ:

もちろん
DELETE FROM CM_OfflineMessages WHERE CONVERT(VARCHAR(max), ID) IN ('1', '2', '3') 

、学習運動などを除いて、これを実行する理由はありませんが、

DELETE FROM CM_OfflineMessages WHERE ID IN (1, 2, 3) 

編集:最終結果はCONVERTなく、より効率的なバージョンと同等であるため、あなたはCA項目のリストには文字列@IDを渡しません。 (how?

+0

質問を編集しました – bilal

+0

@bilal残念ながら、このようにすることはできません:全体に対して単一の@ IDを渡す物事の配列は機能しません。あなたのRDBMSによっては、[テーブル型パラメータ](https://stackoverflow.com/q/11102358/335858)で行うことができるかもしれませんが、一般に、複数の変数 '@ ID1'、' @ ID2 '、' @ ID3'など – dasblinkenlight

0

理由だけ

DELETE FROM CM_OfflineMessages WHERE ID IN (1,2,3) 

を使用しない代わりに、テーブル値パラメータを使用してください??

+0

私はアプリケーションの終わりからintに追加できないので – bilal

0

別のオプションあなたがスプリット/解析機能を持っていない場合は、ここにあなたの文字列を分割するために、インラインアプローチがある

Delete From CM_OfflineMessages 
Where ID in (
       Select RetVal = B.i.value('(./text())[1]', 'int') 
       From (Select x = Cast('<x>' + replace(@ID,',','</x><x>')+'</x>' as xml).query('.')) as A 
       Cross Apply x.nodes('x') AS B(i) 
      )