update Quotation_T
set DOID = CASE
WHEN DOID = '' THEN 19
WHEN DOID LIKE '%10%' THEN DOID
WHEN DOID != '' THEN (DOID + ',' + '20')
END
我收到错误
将nvarchar值'19,20'转换为数据类型int时转换失败
答案 0 :(得分:1)
DOID
最有可能是nvarchar(n)
列-这很明显:您的CASE
表达式必须为所有路径返回相同的数据类型,并且由于第一个WHEN
子句返回一个INT
,所有其他路径也必须返回一个INT
,如果没有,SQL Server会将其返回值转换为INT
例外。
另外:由于您正在更新 DOID
列,因此您应使用其本机数据类型-因此,您的第一个WHEN
子句应返回 >用nvarchar(n)
代替INT
。
请尝试以下代码:
UPDATE Quotation_T
SET DOID = CASE
WHEN DOID = '' THEN CAST(19 AS NVARCHAR(20))
WHEN DOID LIKE '%10%' THEN DOID
WHEN DOID != '' THEN (DOID + N',20')
END
现在,所有WHEN
子句都正确返回要更新的DOID
所期望的数据类型,并且不需要隐式转换。
答案 1 :(得分:0)
我强烈建议将代码编写为:
update Quotation_T
set DOID = (case when doid = '' then '19'
else (DOID + ',20')
end)
where doid not like '%10%' or doid is null;
这甚至不尝试更新不需要更新的行。
我还将观察到,您似乎将逗号分隔的字符串存储在单个列中。如果是这样,我强烈建议您重新考虑数据模型,并改用单独的联结表。 SQL并非真正设计为以字符串形式存储事物列表。这(以及您提出的其他问题)表明,混合类型和在列中存储多个值只会造成不必要的问题。