Sql CASE-THEN子句始终进行计算

Sql CASE-THEN子句始终进行计算,sql,sql-server,formatting,sql-server-2008-r2,Sql,Sql Server,Formatting,Sql Server 2008 R2,我正在做一个SELECT,它使用CASE将nvarchar值转换为一个合适的类型,如下所示: SELECT CASE WHEN @propType = 'money' THEN convert(money, datavalue) [...] ELSE datavalue END FROM [...] 然而,似乎总是执行转换,即使@propType不等于金钱。可运行示例: declare @proptype nvarchar(50)= 'nvarchar' declar

我正在做一个
SELECT
,它使用
CASE
将nvarchar值转换为一个合适的类型,如下所示:

SELECT CASE 
    WHEN @propType = 'money' THEN convert(money, datavalue)
    [...]
    ELSE datavalue
END
FROM [...]
然而,似乎总是执行
转换
,即使
@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语句的参数,然后 提供给案例陈述。例如,下面的查询 在生成最大值时生成被零除的错误 总数的这发生在计算CASE表达式之前


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

看看下面的内容

第一个想法通常是“从第一个开始” 计算的值为数字,转换为十进制,以及所有其他值 数据也应该是十进制的,如果SQL Server能够 将任何值转换为指定的类型,则所有值均为 应为转换类型”。然而,这是不正确的 (尽管第二个很接近)

真正的问题是,如果您选择在任何位置转换值 在Case语句中,转换值的数据类型 to是所有值的预期类型,无论它们是否为 不管是不是那种类型。此外,即使没有一个值可以 已转换(即使代码的转换行从未执行),所有 值仍应为指定的类型 转换函数


为了清楚地了解发生了什么,
then
子句是而不是正在评估的

如果您这样做,您会看到相同的错误

SELECT CASE @proptype
         WHEN 'money' THEN $1.0 /*<-- Literal of datatype money*/
         ELSE @val
       END 

varchar
隐式转换回
varchar
时,显式将其转换为
money
的唯一目的是为了格式化,所以为什么不先将其存储在所需格式中,或者让客户端处理格式?源数据不在我的控制之下。在实际的情况下,我必须跳转好几圈才能将数据转换成这样一种格式,我可以将其插入到指定的报告表中(正确键入)。谢谢,这说明了原因,但实际上没有前进的道路?
declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select 
    case @proptype
        when 'money' then convert(money, @val)
        else cast(@val as SQL_VARIANT)
    end