Sql server 为什么会出现转换问题

Sql server 为什么会出现转换问题,sql-server,type-conversion,Sql Server,Type Conversion,这个查询有什么问题?我正在尝试将int转换为varchar: 我得到这个错误: 将varchar值“1,2,3”转换为数据类型int时,转换失败 编辑: 我已经编辑了查询 [dbo].[CM_DeleteOfflineMessageByID] (@ID AS VARCHAR(MAX)) DELETE FROM CM_OfflineMessages WHERE CONVERT(VARCHAR(MAX), ID) IN (@ID) 但是没有编译时问题,但是数据没有被清除 exec [db

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

我得到这个错误:

将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''' 

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

CONVERTVARCHARmax,ID从int-ID生成varcharmax CONVERTINT。。。将结果转换回int 因为在IN的左边有一个int,所以RDBMS尝试将右边列表中的每个元素也转换为int。“1,2,3”的转换失败,导致错误

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

DELETE FROM CM_OfflineMessages WHERE CONVERT(VARCHAR(max), ID) IN ('1', '2', '3')
当然,除了作为学习练习外,没有理由这样做,因为最终结果相当于一个更高效的版本,而无需转换:

编辑:不能为项目列表传递字符串@ID。改用表值参数

为什么不直接使用

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

如果没有拆分/解析函数,另一个选项是,这里有一种内联方法来拆分字符串

范例


您正在转换为INT:CONVERTINT,…您不是指ID在1,2,3中的位置吗?这里的问题是引号-您试图将ID与字符串“1,2,3”进行比较,这是它出错的地方。删除引号,它将起作用。一个包含逗号的字符串与多个由逗号分隔的字符串或整数等完全不同。与大多数语言一样,SQL不会检查第一种语言的内部,观察逗号并决定将其视为第二种语言。理想情况下,使用一种机制将多个值正确地传递到数据库,或者如果不可能,则搜索字符串拆分和RDBMS产品,以找到大量解决方案。如果需要将多个值传递给过程以执行某些工作,则应真正查看SQL Server 2008及以上版本中的可用值,因为我无法附加,应用程序中的整数end@bilal不幸的是,您不能这样做:为整个数组传递单个@ID是不起作用的。根据您的RDBMS,您可能可以使用,但通常需要多个变量@ID1、@ID2、@ID3等。
DELETE FROM CM_OfflineMessages WHERE ID IN (1, 2, 3)
DELETE FROM CM_OfflineMessages WHERE ID IN (1,2,3)
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)
              )