繁体   English   中英

SQL 服务器兼容性造成问题

[英]SQL Server compatibility creates issue

我们已将 SQL 服务器兼容性从 100 更改为 130,我们存储过程中的以下代码表现不同:

DECLARE @i decimal(4, 0) = 1,
        @j decimal(4, 1) = 0.5

SELECT SUM(@i) - SUM(@j)

select 的结果:

  • 兼容性级别 100:0
  • 兼容级别 130:1

我们不确定我们的代码中有多少这样的计算。

我们可以使 SQL 服务器数据库中的任何设置与兼容级别 100 一样工作吗?

让我们尝试使用合适的数据类型: https://stackoverflow.com/a/7158770/5309660

DECLARE @i decimal(4, 0) = 1,
        @j decimal(4, 1) = 0.5

SELECT CAST(SUM(@i) AS REAL) - CAST(SUM(@j) AS REAL)

SQL Server 之前的版本中,结果的“scale”不符合规则。 这在后来的版本中得到了纠正(我不记得哪个版本发生了变化)。

不,没有办法改回来。

https://learn.microsoft.com/en-us/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-ver16

为了简化事情,问题的要点是兼容级别 120

DECLARE @A decimal(38,0) = 1, 
        @B decimal(38,1) = 0.5

SELECT @A - @B /*Returns 0*/

兼容级别 130

DECLARE @A decimal(38,0) = 1, 
        @B decimal(38,1) = 0.5

SELECT @A - @B /*Returns 1*/

在这两种情况下,结果的数据类型都是decimal(38,0)

您的问题不是询问如何获得0.5的数学上正确的结果。 您只是在询问如何获得 compat 120 行为。

恐怕你不能不设置那个兼容性级别。

注意两个兼容级别

SELECT CONVERT(decimal(38,0), 0.5) 

返回1所以这应该是两种情况下的“预期”结果。

在 100 的情况下,我假设它实际做的是首先转换操作数。 即如下

SELECT @A - CONVERT(decimal(38,0), @B)

认为在这种情况下唯一会有所不同的是当其中一个操作数具有小数点.5并且您正在减去它时。 例如,如果@B0.6 ,则在减法之前向上舍入到最接近的 integer 或减法的结果向下舍入到最接近的 integer 后,它没有任何几率。

SQL Server 2016 重大更改确实调用

在数据库兼容级别 130 下,在某些数字和日期时间数据类型之间执行隐式转换的操作显示出更高的准确性,并可能导致不同的转换值。

虽然它在点击时没有明确提到这种情况。

我们可以使 SQL 服务器数据库中的任何设置与兼容级别 100 一样工作吗?

只能通过设置兼容级别。 兼容性级别机制正是针对此类事情(让您有时间识别和调整任何受影响的代码)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM