始终评估CASE THEN子句

car*_*ett 5 sql sql-server formatting sql-server-2008-r2

我做了SELECT它使用CASE到nvarchar的值转换成合适的类型,像这样:

SELECT CASE 
    WHEN @propType = 'money' THEN convert(money, datavalue)
    [...]
    ELSE datavalue
END
FROM [...]
Run Code Online (Sandbox Code Playgroud)

然而,它似乎convert总是执行,即使@propType等于金钱.可运行的例子:

declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select 
    case @proptype
        when 'money' then convert(money, @val)
        else @val
    end
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我怎么能绕过它呢?MSDN文档说明了这一点:

CASE语句按顺序评估其条件,并在满足条件的第一个条件下停止.在某些情况下,在CASE语句接收表达式的结果作为其输入之前,将计算表达式.评估这些表达式的错误是可能的.首先评估出现在CASE语句的WHEN参数中的聚合表达式,然后提供给CASE语句.例如,以下查询在生成MAX聚合的值时会产生除零错误.这在评估CASE表达式之前发生.

我不确定这是否相关,但对于非本地人来说语言有点沉重,所以也许是这样?

Adr*_*der 3

请查看以下内容在 Transact SQL (T-SQL) 中将 CONVERT() 与 CASE 或 IF 函数一起使用时要小心

第一个想法通常是以下之一“由于评估的第一个值是数字,因此它会转换为十进制,并且所有其他数据也应为十进制”或“如果 SQL Server 能够转换任何值到指定的类型,那么所有值都应该是转换后的类型”。然而,这是不正确的(尽管第二个很接近)!

真正的问题是,如果您选择在 Case 语句中的任何位置转换值,则将值转换为的数据类型是所有值的预期类型,无论它们是否属于该类型。此外,即使实际上没有一个值可以转换(即使 Convert 代码行从未执行),所有值仍应为 Convert 函数指定的类型!