转换失败错误

时间:2016-08-31 09:08:25

标签: sql sql-server

我正在尝试运行以下查询

DECLARE @A VARCHAR(256) = '3.5'

SELECT 
    CASE @A WHEN 'N/A' THEN -1 ELSE @A 
END

但是我收到了这个错误:

  

将varchar值“3.5”转换为数据类型int时,转换失败。

我无法弄明白为什么!

3 个答案:

答案 0 :(得分:7)

您的CASE表达式返回两种不同类型的数据:

CASE @A 
   WHEN 'N/A' THEN -1      -- returns an INT
   ELSE @A                 -- returns VARCHAR(256)
END

SQL Server现在将尝试规范化此响应并尝试将两个响应转换为具有更高优先级的数据类型(有关详细信息,请参阅MSDN上的Data Type Precedence) - 在这种情况下,INT。因此,SQL Server会尝试将@A转换为INT,但显然会失败。

CASE是T-SQL中的表达式 - 它会返回一个原子值所有不同的“路径”在CASE表达式中应该返回相同的数据类型 - 否则会遇到像这样的问题....

答案 1 :(得分:2)

问题是-1是int而@A是varchar

这应该适合你:将-1设为varchar

DECLARE @A varchar(256) = '3.5'

SELECT 
    CASE @A WHEN 'N/A' THEN '-1' ELSE @A 
END

答案 2 :(得分:1)

Try this

DECLARE @A VARCHAR(200) = '4.5'

SELECT CASE @A WHEN 'N/A' THEN CAST(-1 AS VARCHAR) ELSE @A END