我正在尝试运行以下查询
DECLARE @A VARCHAR(256) = '3.5'
SELECT
CASE @A WHEN 'N/A' THEN -1 ELSE @A
END
但是我收到了这个错误:
将varchar值“3.5”转换为数据类型int时,转换失败。
我无法弄明白为什么!
答案 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