Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL REAL 0分区在SQL Server 2008上导致有趣的错误_Sql Server_Sql Server 2008_Compilation_Real Datatype - Fatal编程技术网

Sql server SQL REAL 0分区在SQL Server 2008上导致有趣的错误

Sql server SQL REAL 0分区在SQL Server 2008上导致有趣的错误,sql-server,sql-server-2008,compilation,real-datatype,Sql Server,Sql Server 2008,Compilation,Real Datatype,昨天在SQL Server上发现一个有趣的问题,请尝试以下操作: DECLARE @a REAL = 0.0000 DECLARE @c DECIMAL (18,10) = 20754/3.45 -- this is 6015.6521730000 DECLARE @b DECIMAL (18,10) = CASE WHEN 1 > 2 THEN @a / 100 WHEN 1 = 2 THEN 56 ELSE @c END

昨天在SQL Server上发现一个有趣的问题,请尝试以下操作:

DECLARE @a REAL = 0.0000
DECLARE @c DECIMAL (18,10) = 20754/3.45 -- this is 6015.6521730000
DECLARE @b DECIMAL (18,10) = 
CASE 
    WHEN 1 > 2 
        THEN @a / 100
    WHEN 1 = 2
        THEN 56
    ELSE @c
END

SELECT @b
这似乎是一个精度问题,以及case语句是如何编译的。通过在case语句中将真正的@a转换为十进制,可以很容易地解决这个问题,但是由于返回的是@c,其他的case不应该被命中,因此遇到了一个奇怪的问题。
有人对SQL编译有足够的了解来解释这一点吗?

这是一个错误的答案,请参阅podiluska的正确答案。

case语句的结果类型是第一个
然后
子句的类型。因此:

CASE 
    WHEN 1 > 2 
        THEN @a / 100
使
案例
结果的类型为
@a
,a
实数
。将此更改为:

CASE 
    WHEN 1 > 2 
        THEN cast(@a as decima(18,10)) / 100
要获得十进制(18,10)

的结果,具体操作如下,如文档中所述

[CASE]返回结果_表达式和可选else_结果_表达式中类型集的最高优先级类型

您可以通过添加行来完全打断它

WHEN 1 = 3 then getdate()
还有更详细的解释


我想象编译器假设所有情况都可能发生(你的例子当然是故意歪曲:)

你到底在问什么,我不明白=)结果是
6015.6523437500
,他期望
6015.65217300000
。这不是第一个子句的类型-顺序无关。如果在1>2时将结果交换为
,然后在1=2时将结果交换为12,则@a/100
仍将返回一个实数type@podiluska:有趣的是,我将把这个答案留在这里,这样其他认为这是错误的人可能会觉得很高兴向一个拥有如此高SQL声誉的人传授了一些东西:)当然,导致错误的脚本太复杂,无法指出我需要显示的内容:它仍然对我们的系统造成严重破坏,因为有人在函数中设置了不同的小数精度><感谢这篇文章,现在有意义了。我只是觉得它很有趣,因为它发生的案例应该被跳过,并且可能在将来帮助一些有奇怪错误的人!