2017-08-15 105 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) 

但是没有编译时间问题,但数据没有被清除。

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

要转换为INT:CONVERT(INT, ..) – Serg

+1

难道你不是指“在哪里(1,2,3)'ID? – Serg

+0

这里的问题是引号 - 你试图比较ID和字符串'1,2,3',这是它出错的地方。删除引号,它将起作用 –

回答

1

您正在尝试的int转换为varchar和背部:

  • CONVERT(VARCHAR(max), ID)使得varchar(max)intID
  • CONVERT(INT, ...)结果转换回int

既然你有一个intIN的左边,RDBMS尝试将右侧列表中的每个元素转换为int'1,2,3'转换失败,导致错误。

如果你想ID转换为varchar和使用IN列表里面varchar文字,下降外转换:

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

当然,没有理由这样做,除了作为一个学习锻炼,因为最终的结果是等同于更高效的版本不CONVERT

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

编辑:您CA没有通过一个字符串@ID的项目列表。使用表值参数,而不是(how?

+0

我已编辑的问题,请检查 – bilal

+0

@bilal不幸的是,你不能这样做:为一个整体传递一个'@ ID'一些事情不起作用。根据你的RDBMS,你可以通过[table-typed parameter](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) 
      ) 
相关问题