sql-server - SQL REAL 0 除法在 SQL Server 2008 上导致有趣的错误

标签 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

SELECT @b

看起来是精度的问题,以及case语句如何编译的问题。通过在 case 语句中将 REAL @a 转换为小数可以很容易地解决这个问题,但由于我们返回的是 @c 并且其他情况永远不应该被击中,所以这是一个奇怪的问题。 有人对 SQL 编译有足够的了解来解释这一点吗?

最佳答案

已降至Data Type Precedence ,详见文档

[CASE] Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression.

http://msdn.microsoft.com/en-us/library/ms181765(v=sql.100).aspx

您可以通过添加行来完全破坏它

WHEN 1 = 3 then getdate()

有更详细的解释here

我想编译器假设所有情况都是可能的(你的例子当然是故意反常的:))

关于sql-server - SQL REAL 0 除法在 SQL Server 2008 上导致有趣的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12950174/

相关文章:

sql - 基于多个聚合列进行透视

sql - 如何在存储过程中使用名称求和和分组?

sql - 如果发生 NULL,Where 子句拒绝行

c - 未使用函数的函数原型(prototype)

c++ - 从 C++ 调用 Fortran 子例程,链接时 undefined reference

在 GCC 中编译而不生成输出文件

sql-server - 如何在数据库项目中设置初始数据库文件大小和文件增长?

mysql - 在多个 SQL 语句中使用 Count() 并使用 join 连接它们

c# - 不将日期属性设置为对象会导致错误

sql-server - 如何在不依赖网络可靠性的情况下在 Azure 数据库上远程运行脚本