昨天在 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/