簡體   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