查询有什么问题?我正在尝试将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'''
答案 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)
)