将nvarchar值'value,value'转换为int时转换失败

时间:2018-06-30 06:15:42

标签: sql sql-server sql-server-2008

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时转换失败

2 个答案:

答案 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并非真正设计为以字符串形式存储事物列表。这(以及您提出的其他问题)表明,混合类型和在列中存储多个值只会造成不必要的问题。