【问题标题】:SQL Server compatibility creates issueSQL Server 兼容性产生问题
【发布时间】:2020-09-29 05:15:51
【问题描述】:

我们已将 SQL Server 兼容性从 100 更改为 130,我们存储过程中的以下代码的行为有所不同:

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

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

选择结果:

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

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

我们可以在 SQL Server 数据库中进行任何设置以与兼容级别 100 相同吗?

【问题讨论】:

  • 我很确定问题出在sum(),这两种类型返回decimal(38,0)decimal(38,1)。版本之间发生了一些微妙的变化;更令人震惊的是,结果不是0.5,是正确答案。
  • 我怀疑问题是@i decimal(4,0),零表示没有小数位。如果你把它改成@i decimal(4,1)你会找到正确的答案。
  • 我的问题是为什么同一组代码在兼容性方面表现不同以及如何解决这个问题。可以修复代码。但是如何在不修改所有地方的情况下修复所有地方
  • 如果不修改代码,您唯一的办法就是降低兼容性级别。小数(38,0)和小数(38,1)相加的数据类型结果为小数(38,0)。每个decimal addition documentation 的比例减少到零。
  • 微软有一个工具叫做Data Migration Assistant。它可以帮助您发现此类问题。更改可比性级别可能会为您的系统引入其他更改。

标签: sql sql-server tsql sql-types


【解决方案1】:

让我们尝试使用合适的数据类型: 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-03
    • 2019-05-17
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多