【问题标题】:Conversion failed when converting the nvarchar value 'value,value' to int将 nvarchar 值 'value,value' 转换为 int 时转换失败
【发布时间】:2018-06-30 06:15:41
【问题描述】:
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 时转换失败

【问题讨论】:

  • 很可能,DOIDnvarchar(n) 列 - 那么很明显:您的 CASE 表达式必须为所有路径返回相同的数据类型,并且从第一个WHEN 子句返回一个INT,所有其他路径也必须返回一个INT,如果不返回,SQL Server 会将它们的返回值转换为INT,从而导致异常

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


【解决方案1】:

很可能,DOIDnvarchar(n) 列 - 那么很明显:您的 CASE 表达式必须为所有路径返回相同的数据类型,并且由于第一个 WHEN 子句返回INT,所有其他路径也必须返回 INT,如果不返回,SQL Server 会将其返回值转换为 INT,从而导致异常。

另外:由于您要更新 DOID 列,您应该使用它的本机数据类型 - 所以您的第一个 WHEN 子句应该返回 @987654330 @ 而不是 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 期望的数据类型,并且不需要隐式转换。

【讨论】:

  • 它工作正常。我需要更多帮助。选择不同的 A.Item_Code,(B.Description + '-' + B.Product_Code + '(' + D.Brand_Name+ ')') 作为 Description,A.Quantity,B.UOM,A.Rate,A.DOID,C .Doc_No,B.Tax_Percentage as Tax,B.Tax_Percentage as Tax1,F.QuotationID FROM DO_T A INNER JOIN inv_Item_Master B ON A.Item_Code=B.Item_Code INNER JOIN DO C ON A.DOID=C.DOID inner join Inv_Brand D on D.Brand_ID = B.Brand_ID INNER JOIN Quotation_T F ON F.DOID = A.DOID WHERE A.DOID like '%'+@DOID+'%' and a.BR_Code=@brcode END.得到相同的错误:转换时转换失败将 nvarchar 值 '22,23' 转换为数据类型 int。
  • @neethamathew:为此发布一个新问题
  • 你为什么要投19而不是N'19'
  • @GordonLinoff: 不知道 19 是否实际上是来自列或变量的值 - 但我同意 - 使用 N'19' 作为字符串文字会一样好
【解决方案2】:

我强烈建议将代码编写为:

update Quotation_T  
    set DOID = (case when doid = '' then '19'
                     else (DOID + ',20')
                end)
    where doid not like '%10%' or doid is null;

这甚至不会尝试更新不需要更新的行。

我还会观察到您似乎将逗号分隔的字符串存储在单个列中。如果是这样,我强烈建议您重新考虑您的数据模型,并改用单独的联结表。 SQL 并不是真正设计用于将事物列表存储在字符串中。这(以及您提出的其他问题)表明混合类型和在列中存储多个值只会产生不必要的问题。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2011-08-29
    • 2015-06-20
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多