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