为何出现转换问题

时间:2017-08-15 09:40:13

标签: sql-server type-conversion

查询有什么问题?我正在尝试将int转换为varchar

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

我收到此错误:

  

将varchar值'1,2,3'转换为数据类型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''' 

3 个答案:

答案 0 :(得分:1)

您正尝试将int转换为varchar并返回:

  • CONVERT(VARCHAR(max), ID)varchar(max)int
  • 获取ID
  • CONVERT(INT, ...)会将结果转换回int

由于int左侧有IN,因此RDBMS会尝试将右侧列表中的每个元素转换为int。转换'1,2,3'失败,导致错误。

如果您希望将ID转换为varchar并在varchar列表中使用IN文字,请删除外部转换:

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

当然,除了作为学习练习之外,没有理由这样做,因为最终结果相当于没有CONVERT的更高效版本:

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

修改:您无法为字段列表传递字符@ID。改为使用表值参数(how?

答案 1 :(得分:0)

为什么不使用

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

...

答案 2 :(得分: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)
              )