我正在做一个SELECT
用于CASE
将 nvarchar 值转换为适当类型的方法,如下所示:
SELECT CASE
WHEN @propType = 'money' THEN convert(money, datavalue)
[...]
ELSE datavalue
END
FROM [...]
然而,似乎总是被convert
执行,即使@propType
不等于金钱。可运行示例:
declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select
case @proptype
when 'money' then convert(money, @val)
else @val
end
为什么会这样,我该如何解决?MSDN 文档是这样说的:
CASE 语句按顺序评估其条件并在满足条件的第一个条件处停止。在某些情况下,在 CASE 语句接收表达式结果作为其输入之前计算表达式。评估这些表达式时可能会出错。首先计算出现在 CASE 语句的 WHEN 参数中的聚合表达式,然后将其提供给 CASE 语句。例如,以下查询在生成 MAX 聚合的值时会产生除以零错误。这发生在评估 CASE 表达式之前。
我不确定这是否相关,但是对于非本地人来说,语言有点重,所以也许是这样?